CryptoJS AES和Java AES加密值不匹配

时间:2013-05-15 06:39:03

标签: java javascript aes cryptojs

我正在尝试在客户端加密并使用AES在服务器中解密,     所以使用cryptojs在客户端加密CBC模式和nopadding     在服务器端也使用具有相同模式和nopadding的Cipher

function call()
{
  var key = CryptoJS.enc.Hex.parse('roshanmathew1989');
  var iv  = CryptoJS.enc.Hex.parse('roshanmathew1989');
  var encrypted = CryptoJS.AES.encrypt("roshanmathew1989",key,{ iv: iv},
      {padding:CryptoJS.pad.NoPadding});
  alert(encrypted.ciphertext.toString(CryptoJS.enc.Base64));
  alert(encrypted.iv.toString());
}

服务器端代码

public class Crypto
{ 

  private static byte[] key = null;

  public void setKey(String key){this.key=key.getBytes();}

  public String encrypt(String strToEncrypt)
  {
    String encryptedString =null;
    try
    {
      Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
      final SecretKeySpec secretKey = new SecretKeySpec(key,"AES");
      System.out.println("sdfsdf = "+key.toString());
      IvParameterSpec ips = new IvParameterSpec(key);
      cipher.init(Cipher.ENCRYPT_MODE, secretKey,ips);
      encryptedString = Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes()));
    }
    catch(Exception e)
    {
      System.out.println(" ERROR : "+e.getMessage());
    }
    return encryptedString;

  } other method omitted ....

实施

Crypto cry=new Crypto();
cry.setKey("roshanmathew1989");
String s=cry.encrypt("roshanmathew1989");

结果

Browser side value =       O64X/bKNBu7R2Tuq2lUbXeFlQ7wD2YnFasyyhsVUryw=
Server side value of s =   RrNcVIER/75fzdjHr884sw==

有人可以指出错误吗?

1 个答案:

答案 0 :(得分:0)

代码存在一些问题:

  • 您正在使用JavaScript中的密钥的十六进制解码,String.getBytes() - 字符编码而不指定字符集 - 在Java中
  • 你的密钥是16个字符(它应该是16,24或32个随机字节),但它不是十六进制的
  • 你正在加密而不是在“服务器端”进行解密,尽管那可能是故意的

再看看如何执行编码和字符编码,它们对于良好的加密至关重要,并且经常执行不正确(这可能是Stackoverflow上关于加密的最常见问题)