Java与Node.js利用AES加密解密出相同结果的方法示例
前言
工作中遇到nodejs端通过aes加密,安卓客户端Java解密,同样nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥再MD5加密一遍,以下是Java与Node.js利用AES加密解密出相同结果的方法,需要的朋友们下面来一起学习学习吧。
JAVA代码如下:
packageg.g;
importjava.security.MessageDigest;
importjavax.crypto.Cipher;
importjavax.crypto.spec.SecretKeySpec;
publicclassAesECB{
publicstaticfinalStringDEFAULT_CODING="utf-8";
/**
*解密
*@authorlmiky
*@date2014-2-25
*@paramencrypted
*@paramseed
*@return
*@throwsException
*/
privatestaticStringdecrypt(Stringencrypted,Stringseed)throwsException{
byte[]keyb=seed.getBytes(DEFAULT_CODING);
MessageDigestmd=MessageDigest.getInstance("MD5");
byte[]thedigest=md.digest(keyb);
SecretKeySpecskey=newSecretKeySpec(thedigest,"AES");
Cipherdcipher=Cipher.getInstance("AES");
dcipher.init(Cipher.DECRYPT_MODE,skey);
byte[]clearbyte=dcipher.doFinal(toByte(encrypted));
returnnewString(clearbyte);
}
/**
*加密
*@authorlmiky
*@date2014-2-25
*@paramcontent
*@paramkey
*@return
*@throwsException
*/
publicstaticStringencrypt(Stringcontent,Stringkey)throwsException{
byte[]input=content.getBytes(DEFAULT_CODING);
MessageDigestmd=MessageDigest.getInstance("MD5");
byte[]thedigest=md.digest(key.getBytes(DEFAULT_CODING));
SecretKeySpecskc=newSecretKeySpec(thedigest,"AES");
Ciphercipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,skc);
byte[]cipherText=newbyte[cipher.getOutputSize(input.length)];
intctLength=cipher.update(input,0,input.length,cipherText,0);
ctLength+=cipher.doFinal(cipherText,ctLength);
returnparseByte2HexStr(cipherText);
}
/**
*字符串转字节数组
*@authorlmiky
*@date2014-2-25
*@paramhexString
*@return
*/
privatestaticbyte[]toByte(StringhexString){
intlen=hexString.length()/2;
byte[]result=newbyte[len];
for(inti=0;i<len;i++){
result[i]=Integer.valueOf(hexString.substring(2*i,2*i+2),16).byteValue();
}
returnresult;
}
/**
*字节转16进制数组
*@authorlmiky
*@date2014-2-25
*@parambuf
*@return
*/
privatestaticStringparseByte2HexStr(bytebuf[]){
StringBuffersb=newStringBuffer();
for(inti=0;i<buf.length;i++){
Stringhex=Integer.toHexString(buf[i]&0xFF);
if(hex.length()==1){
hex='0'+hex;
}
sb.append(hex);
}
returnsb.toString();
}
publicstaticvoidmain(String[]args)throwsException{
System.out.println(AesECB.encrypt("fsadfsdafsdafsdafsadfsadfsadf","1eVRiqy7b9Uv7ZMM"));
System.out.println(AesECB.decrypt("b123e2d9199598c0e3f1999dc9e723387b68e29d2b3a0d59fc7d5946c750c6b4","1eVRiqy7b9Uv7ZMM"));
}
}
Node.js代码如下:
varcrypto=require('crypto');
exports.aes_algorithm="aes-128-ecb";
exports.aes_secrect="1eVRiqy7b9Uv7ZMM";
exports.encrypt=function(text){
varcipher=crypto.createCipher(this.aes_algorithm,this.aes_secrect)
varcrypted=cipher.update(text,'utf8','hex')
crypted+=cipher.final('hex');
returncrypted;
};
exports.decrypt=function(text){
vardecipher=crypto.createDecipher(this.aes_algorithm,this.aes_secrect)
vardec=decipher.update(text,'hex','utf8')
dec+=decipher.final('utf8');
returndec;
};
//varhw=this.encrypt("fsadfsdafsdafsdafsadfsadfsadf");
//console.log(hw);
//console.log(this.decrypt(hw));
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。