源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Node.js中AES加密和其它语言不一致问题解决办法

  • 时间:2020-03-25 18:14 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Node.js中AES加密和其它语言不一致问题解决办法
[b]例子一:[/b] 这几天被一个问题困扰着。Nodejs的AES加密和Java,C#加密出来的不一致。当然,这样就不能解密了。纠结了许久:后来还是实在不行了,看了下源代码,要不然还得继续纠结下去。网上说,通常的nodejs AES和其他语言实现不一样。好吧~~或许吧。 [b]nodejs的crypto模块。[/b]
[u]复制代码[/u] 代码如下:
var crypto = require('crypto');     var data = "156156165152165156156";     console.log('Original cleartext: ' + data);     var algorithm = 'aes-128-ecb';     var key = '78541561566';     var clearEncoding = 'utf8';     //var cipherEncoding = 'hex';     //If the next line is uncommented, the final cleartext is wrong.     var cipherEncoding = 'base64'; /*加密*/     var cipher = crypto.createCipher(algorithm, key);     var cipherChunks = [];     cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));     cipherChunks.push(cipher.final(cipherEncoding));     console.log(cipherEncoding + ' ciphertext: ' + cipherChunks.join('')); /*解密*/     var decipher = crypto.createDecipher(algorithm, key);     var plainChunks = [];     for (var i = 0;i < cipherChunks.length;i++) {       plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));     }     plainChunks.push(decipher.final(clearEncoding));     console.log("UTF8 plaintext deciphered: " + plainChunks.join(''));
的确,没错~~加密解密成功。但是和java,C#中加密出来的不一样啊。神啊。我想,大家都在这里纠结着吧~~对不对。其实只要加个向量,就可以和一致了。网上搜索出来的资源太少。才让自己纠结那么久。好吧,[b]正确代码是: [/b]
[u]复制代码[/u] 代码如下:
var crypto = require('crypto');     var data = "156156165152165156156";     console.log('Original cleartext: ' + data);     var algorithm = 'aes-128-ecb';     var key = '78541561566';     var clearEncoding = 'utf8';     var iv = "";     //var cipherEncoding = 'hex';     //If the next line is uncommented, the final cleartext is wrong.     var cipherEncoding = 'base64';     var cipher = crypto.createCipheriv(algorithm, key,iv);     var cipherChunks = [];     cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));     cipherChunks.push(cipher.final(cipherEncoding));     console.log(cipherEncoding + ' ciphertext: ' + cipherChunks.join(''));     var decipher = crypto.createDecipheriv(algorithm, key,iv);     var plainChunks = [];     for (var i = 0;i < cipherChunks.length;i++) {       plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));     }     plainChunks.push(decipher.final(clearEncoding));     console.log("UTF8 plaintext deciphered: " + plainChunks.join(''));
对比发现,加密出来是一致的。好吧,结贴~~~我恨你,浪费了我一天时间。 [b]例子二:[/b] 工作中遇到nodejs端通过aes加密,安卓客户端java解密,同意nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥za再MD5加密一遍,以下是aes ecb加密的内容,如果是cbc也同样需要对秘钥MD5加密: nodejs:
[u]复制代码[/u] 代码如下:
/**  * aes加密  * @param data  * @param secretKey  */  encryptUtils.aesEncrypt = function(data, secretKey) {      var cipher = crypto.createCipher('aes-128-ecb',secretKey);      return cipher.update(data,'utf8','hex') + cipher.final('hex');  }  /**  * aes解密  * @param data  * @param secretKey  * @returns {*}  */  encryptUtils.aesDecrypt = function(data, secretKey) {      var cipher = crypto.createDecipher('aes-128-ecb',secretKey);      return cipher.update(data,'hex','utf8') + cipher.final('utf8');  } 
java:
[u]复制代码[/u] 代码如下:
package com.iofamily.util;  import java.security.MessageDigest;  import javax.crypto.Cipher;  import javax.crypto.spec.SecretKeySpec;  /**  * AES加密,与Nodejs 保持一致  * @author lmiky  * @date 2014-2-25  */  public class AESForNodejs {      public static final String DEFAULT_CODING = "utf-8";      /**      * 解密      * @author lmiky      * @date 2014-2-25      * @param encrypted      * @param seed      * @return      * @throws Exception      */      private static String decrypt(String encrypted, String seed) throws Exception {          byte[] keyb = seed.getBytes(DEFAULT_CODING);          MessageDigest md = MessageDigest.getInstance("MD5");          byte[] thedigest = md.digest(keyb);          SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");          Cipher dcipher = Cipher.getInstance("AES");          dcipher.init(Cipher.DECRYPT_MODE, skey);          byte[] clearbyte = dcipher.doFinal(toByte(encrypted));          return new String(clearbyte);      }      /**      * 加密      * @author lmiky      * @date 2014-2-25      * @param content      * @param key      * @return      * @throws Exception      */      public static String encrypt(String content, String key) throws Exception {          byte[] input = content.getBytes(DEFAULT_CODING);          MessageDigest md = MessageDigest.getInstance("MD5");          byte[] thedigest = md.digest(key.getBytes(DEFAULT_CODING));          SecretKeySpec skc = new SecretKeySpec(thedigest, "AES");          Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");          cipher.init(Cipher.ENCRYPT_MODE, skc);          byte[] cipherText = new byte[cipher.getOutputSize(input.length)];          int ctLength = cipher.update(input, 0, input.length, cipherText, 0);          ctLength += cipher.doFinal(cipherText, ctLength);          return parseByte2HexStr(cipherText);      }      /**      * 字符串转字节数组      * @author lmiky      * @date 2014-2-25      * @param hexString      * @return      */      private static byte[] toByte(String hexString) {          int len = hexString.length() / 2;          byte[] result = new byte[len];          for (int i = 0; i < len; i++) {              result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();          }          return result;      }      /**      * 字节转16进制数组      * @author lmiky      * @date 2014-2-25      * @param buf      * @return      */      private static String parseByte2HexStr(byte buf[]) {          StringBuffer sb = new StringBuffer();          for (int i = 0; i < buf.length; i++) {              String hex = Integer.toHexString(buf[i] & 0xFF);              if (hex.length() == 1) {                  hex = '0' + hex;              }              sb.append(hex);          }          return sb.toString();      }      public static void main(String[] args) throws Exception {          System.out.println(AESForNodejs.encrypt("fsadfsdafsdafsdafsadfsadfsadf", "1234fghjnmlkiuhA"));          System.out.println(AESForNodejs.decrypt("5b8e85b7a86ad15a275a7cb61fe4c0606005e8741f68797718a3e90d74b5092a", "1234fghjnmlkiuhA"));      }  }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部