2

次のpythonコードがあります:

def AES_build_cipher(key, iv, op):
   return EVP.Cipher(alg='aes_128_cbc', key=key, iv=iv, op=op, padding=True) # PKCS#5 paddig

def AES_encrypt(key, msg, iv): # key, iv -> bytes, msg -> text
   if iv is None:
       raise ValueError("IV must be defined!")

  # Return the encryption function
   def encrypt(data):
       cipher = AES_build_cipher(key, iv, ENCRYPTION)
       v = cipher.update(data)
       v = v + cipher.final()
       del cipher
       return v

   return encrypt(msg)

問題なく動作します (M2Crypto による暗号化/復号化)。

復号化のための Java コード:

public static String AESDecrypt(String b64data, byte[] key, byte[] iv) throws CipherException {
    try {
        aesCipher_ = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aesCipher_.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));

        final byte[] byteData = Base64.decode(b64data, Base64.DEFAULT);
        final byte[] decryptedData = aesCipher_.doFinal(byteData);

        return new String(decryptedData);
    } catch (Exception e) {
        throw new CipherException(e);
    }
}

データ:

  • iv = 8b9123ba6712612fb98452aac3854838 (16 進表記)
  • text = 12345678901234567890 (単純なテキスト)
  • ciphertext = af87d97bf9779efcff0386d4eaee18619dc8f1fe7c5adea2a91657f53491bc2 (16 進表現)
  • password = 791a06ee369dc2f842c655f6bec8ce2 (16 進数表記)

結果:

  • Exp:'12345678901234567890'
  • 得:「1���$V��c�J�}7890」

IV (結果の最初の 16 バイト) に問題があるようです。しかし、私は何を逃したのか分かりません。

4

1 に答える 1

1

問題はPythonのIVにありました。実際には、ASCII 文字列ではなく、Unicode 文字列になります。次のコードは、Unicode str を ascii str に変換するのに役立ちます。

''.join([chr(ord(x)) for x in request.session['iv']])
于 2013-09-17T05:50:44.870 に答える