java php c# 三种语言的AES加密互转


最近做的项目中有一个领取优惠券的功能,项目是用php写得,不得不佩服,php自带的方法简洁而又方便好用。项目是为平台为其他公司发放优惠券,结果很囧的是接了三家优惠券公司,一家php,一家java,一家c#,下面就是整理出来的三种语言的加密解密方法:


简单介绍一下这里踩过的坑,最开始没有意识到不同的语言对加密实现的差别,服务端这里实现使用的ECB模式,PKCS7Padding填充模式,key没有位数限制(对比java中是有位数限制的)。java如果实现PKCS7Padding填充模式需要替换系统中的jar包,考虑到对方系统稳定性就放弃了PKCS7的实现转而去实现PKCS5,如果想实现PKCS7具体请参考http://www.cnblogs.com/haogj/p/4226178.html

php ECB模式,PKCS7Padding填充,块大小为256,代码如下(java、C#版本代码待补充)

  1. /**
  2. * 加密方法
  3. * @param string $str
  4. * @return string
  5. */
  6. public function encrypt($str)
  7. {
  8. //AES, 128 ECB模式加密数据
  9. $screct_key = $this->_app_key;
  10. $screct_key = base64_decode($screct_key);
  11. $str = trim($str);
  12. $str = $this->addPKCS7Padding($str);
  13. $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
  14. $encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $screct_key, $str, MCRYPT_MODE_ECB, $iv);
  15. return base64_encode($encrypt_str);
  16. }
  17. /**
  18. * 解密方法
  19. * @param string $str
  20. * @return string
  21. */
  22. private function decrypt($str)
  23. {
  24. //AES, 128 ECB模式加密数据
  25. $screct_key = $this->_app_key;
  26. $str = base64_decode($str);
  27. $screct_key = base64_decode($screct_key);
  28. $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
  29. $encrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $screct_key, $str, MCRYPT_MODE_ECB, $iv);
  30. $encrypt_str = trim($encrypt_str);
  31. $encrypt_str = $this->stripPKSC7Padding($encrypt_str);
  32. return $encrypt_str;
  33. }
  34. /**
  35. * 填充算法
  36. * @param string $source
  37. * @return string
  38. */
  39. private function addPKCS7Padding($source)
  40. {
  41. $source = trim($source);
  42. $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
  43. $pad = $block - (strlen($source) % $block);
  44. if ($pad <= $block) {
  45. $char = chr($pad);
  46. $source .= str_repeat($char, $pad);
  47. }
  48. return $source;
  49. }
  50. /**
  51. * 移去填充算法
  52. * @param string $source
  53. * @return string
  54. */
  55. private function stripPKSC7Padding($source)
  56. {
  57. $source = trim($source);
  58. $char = substr($source, -1);
  59. $num = ord($char);
  60. if ($num > 32) return $source;
  61. $source = substr($source, 0, -$num);
  62. return $source;
  63. }

ECB模式,PKCS5Padding填充。注意注意注意java只支持16位的key!!!

php 版本

  1. /*
  2. * 加密输入的字符串
  3. */
  4. private function encrypt($input) {
  5. $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
  6. $input = $this->pkcs5_pad($input, $size);
  7. $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
  8. $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  9. mcrypt_generic_init($td, $this->_app_key, $iv);
  10. $data = mcrypt_generic($td, $input);
  11. mcrypt_generic_deinit($td);
  12. mcrypt_module_close($td);
  13. $data = base64_encode($data);
  14. return $data;
  15. }
  16. /*
  17. * 解密字符串
  18. */
  19. private function decrypt($sStr) {
  20. $decrypted= mcrypt_decrypt(
  21. MCRYPT_RIJNDAEL_128,
  22. $this->_app_key,
  23. base64_decode($sStr),
  24. MCRYPT_MODE_ECB
  25. );
  26. $dec_s = strlen($decrypted);
  27. $padding = ord($decrypted[$dec_s-1]);
  28. $decrypted = substr($decrypted, 0, -$padding);
  29. return $decrypted;
  30. }
  31. /*
  32. * 填充模式
  33. */
  34. private static function pkcs5_pad ($text, $blocksize)
  35. {
  36. $pad = $blocksize - (strlen($text) % $blocksize);
  37. return $text . str_repeat(chr($pad), $pad);
  38. }

java版本

  1. /**
  2. * 加密源数据
  3. *
  4. * @param input
  5. * @return
  6. */
  7. private String encrypt(String input) {
  8. byte[] crypted = null;
  9. try {
  10. SecretKeySpec skey = new SecretKeySpec(AppKey.getBytes(), "AES");
  11. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  12. cipher.init(Cipher.ENCRYPT_MODE, skey);
  13. crypted = cipher.doFinal(input.getBytes("UTF-8"));
  14. } catch (Exception e) {
  15. System.out.println(e.toString());
  16. }
  17. return new String(Base64.encodeBase64(crypted));
  18. }
  19. /**
  20. * 解密源数据
  21. *
  22. * @param input
  23. * @return
  24. */
  25. private String decrypt(String input) {
  26. byte[] output = null;
  27. try {
  28. SecretKeySpec skey = new SecretKeySpec(AppKey.getBytes(), "AES");
  29. Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  30. cipher.init(Cipher.DECRYPT_MODE, skey);
  31. output = cipher.doFinal(Base64.decodeBase64(input));
  32. } catch (Exception e) {
  33. System.out.println(e.toString());
  34. }
  35. return new String(output);
  36. }

c#版本

  1. /// <summary>
  2. /// AES 加密
  3. /// </summary>
  4. /// <param name="str"></param>
  5. /// <param name="key"></param>
  6. /// <returns></returns>
  7. public static string AesEncrypt(string str, string key)
  8. {
  9. if (string.IsNullOrEmpty(str)) return null;
  10. Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
  11. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  12. {
  13. Key = Encoding.UTF8.GetBytes(key),
  14. Mode = System.Security.Cryptography.CipherMode.ECB,
  15. Padding = System.Security.Cryptography.PaddingMode.PKCS7,
  16. };
  17. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
  18. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  19. return Convert.ToBase64String(resultArray, 0, resultArray.Length);
  20. }
  21. /// <summary>
  22. /// AES 解密
  23. /// </summary>
  24. /// <param name="str"></param>
  25. /// <param name="key"></param>
  26. /// <returns></returns>
  27. public static string AesDecrypt(string str, string key)
  28. {
  29. if (string.IsNullOrEmpty(str)) return null;
  30. Byte[] toEncryptArray = Convert.FromBase64String(str);
  31. System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
  32. {
  33. Key = Encoding.UTF8.GetBytes(key),
  34. Mode = System.Security.Cryptography.CipherMode.ECB,
  35. Padding = System.Security.Cryptography.PaddingMode.PKCS7
  36. };
  37. System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
  38. Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  39. return Encoding.UTF8.GetString(resultArray);
  40. }

java php c# 三种语言的AES加密互转的更多相关文章

  1. AES加密php,java,.net三种语言同步实现加密、解密

    话不多数上代码: java::: /* * To change this license header, choose License Headers in Project Properties. * ...

  2. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  3. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  4. MD5:js,java,C#三种语言加密结果不同解决办法

    最近遇到前端js MD5加密与后端C#与Java MD5加密结果不一致的问题,所以写个关于此问题的解决办法 前端js引用的md5类库,类库地址:https://blueimp.github.io/Ja ...

  5. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  6. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  7. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  8. Java多线程的三种实现方式

    java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...

  9. OID,主键生成策略,PO VO DTO,get和load区别,脏检查,快照,java对象的三种状态

    主键生成策略 sequence 数据库端 native 数据库端 uuid  程序端 自动赋值 生成的是一个32位的16进制数  实体类需把ID改成String 类型 assigned  程序端 需手 ...

随机推荐

  1. C#_界面程序_数码游戏

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. android studio run的时候一直卡在waiting for debug

    原因如下: 选择ok就可以,同时我们也可以从这里找到 平常遇到跟真机有关的问题,三步大法,1,插拔手机,2.adb kill-server;adb start-server 3.重启as

  3. html5 canvas 奇怪的形状水平渐变(因为大多数的之前的文章把基础都打过了,所以开始写的快了,如果有不明白的,可以回顾下之前的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 第5月第10天 node.js的request模块

    1.node.js的request模块 http://www.cnblogs.com/meteoric_cry/archive/2012/08/18/2645530.html

  5. 爬虫笔记之w3cschool注册页面滑块验证码破解(巨简单滑块位置识别,非鼠标模拟轨迹)

    一.背景介绍 最开始接触验证码破解的时候就是破解的w3cschool的使用手机号找回密码页面的验证码,详见:验证码识别之w3cschool字符图片验证码(easy级别),这次破解一下他们注册页面的滑块 ...

  6. Python输出9*9 乘法表

    for i in range(1,10): for j in range(1,i+1): print(str(j) + str("*") + str(i)+"=" ...

  7. Mysql备份文件

  8. Project Euler Problem3

    Largest prime factor Problem 3 The prime factors of 13195 are 5, 7, 13 and 29. What is the largest p ...

  9. 001_关于选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘。问题解决

    问题: 今天我的diy电脑重装系统时,遇到了一个棘手的问题.在选择安装分区的时候,提示有这样的错误. Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows ...

  10. C# wpf 阻止*和|的输入

    private void texBox_KeyDown(object sender, KeyEventArgs e) { if (Keyboard.Modifiers == ModifierKeys. ...