簡體   English   中英

CryptoJS AES和Java AES加密值不匹配

[英]CryptoJS AES and Java AES encrypted value mismatch

我正在嘗試使用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==

有人可以指出錯誤嗎?

該代碼有一些錯誤:

  • 您在JavaScript中使用密鑰的十六進制解碼,並且在Java中使用String.getBytes() -字符編碼而未指定字符集-
  • 您的密鑰為16個字符(應為16個,24個或32個隨機字節 ),但不能為十六進制
  • 您正在加密而不是在“服務器端”解密,盡管那可能是故意的

再看看如何執行編碼和字符編碼,它們對於良好的加密至關重要,並且經常執行不正確(這可能是Stackoverflow上最常見的加密問題)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM