0

クライアントで暗号化し、AESを使用してサーバーで復号化しようとしているため、cryptojsを使用してクライアント側でCBCモードで暗号化し、サーバー側でnopaddingを使用Cipherして、同じモードとnopaddingのクラスも使用します

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==

誰でも間違いを指摘できますか?

4

1 に答える 1

0

コードにはいくつか問題があります。

  • JavaScript ではキーの 16 進数デコードを使用しておりString.getBytes()、Java では - 文字セットを指定せずに文字エンコーディングを使用しています。
  • キーは 16 文字 (ランダム化された 16、24、または 32バイトである必要があります) ですが、16 進数ではありません
  • 「サーバー側」で復号化する代わりに暗号化していますが、それはおそらく意図的なものです

エンコーディングと文字エンコーディングを実行する方法をもう一度よく見てください。これらは適切な暗号化に不可欠であり、しばしば正しく実行されません (暗号化に関する Stackoverflow でおそらく最も一般的な問題です)。

于 2013-05-19T00:20:16.493 に答える