7

Python プログラムで一部のデータを暗号化して保存し、そのデータを Java プログラムで復号化しようとしています。Python では、次のように暗号化しています。

from Crypto.Cipher import AES
KEY = '12345678901234567890123456789012'

def encrypt(data):
    cipher = AES.new(KEY, AES.MODE_CFB)
    return cipher.encrypt(data)

Java では、次のように復号化します。

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

public class Encryption {
    private static byte[] KEY = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2' };

    public static byte[] decrypt(byte[] data) throws NoSuchAlgorithmException, NoSuchPaddingException,
            InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        Cipher c = Cipher.getInstance("AES/CFB/NoPadding");
        Key key = new SecretKeySpec(KEY, "AES");
        c.init(Cipher.DECRYPT_MODE, key);
        return c.doFinal(data);
    }
}

しかし、私は得るException in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters。明らかに、私は何か間違ったことをしています。しかし、何?

4

3 に答える 3

6

問題が発生する理由は、セキュリティ ポリシーによって鍵のサイズが 128 ビットに制限されており、256 ビットの鍵を使用しようとしているためです (Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files が必要です)。

この議論を見ると、おそらく同様の問題があることに気付くでしょう。私は実際に自分のマシンで同じ問題を抱えていました。セキュリティ ポリシーを更新した後、コードを実行できました。また、次の変更を行う必要があると思いますc.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));。CFB モードの初期化ベクトルがありません。復号化された値が正しくない場合は、キーの初期化方法を確認してください。

于 2012-05-04T02:20:03.847 に答える
4

これには、言語間暗号化 API を使用することを強くお勧めします。私はKeyczarの大ファンで、たまたま Java と Python のライブラリがあります。API は次のように単純です。

public String encrypt(String data)
public String decrypt(String data)

JavaPythonの両方で。

于 2012-05-03T23:45:44.433 に答える
1
  • 「abc」や「abc」などの Python 2 文字列リテラルは ASCII です。
  • u'abc' や u"abc" などの Python 2 文字列リテラルは Unicode です。
  • 「abc」や「abc」などの Python 3 文字列リテラルは Unicode です。
  • b'abc' や b"abc" などの Python 3 文字列リテラルはバイト型です。

Java は、Python 3 と同様に、デフォルトで Unicode を使用します。

言語間で相互運用可能な暗号については、https://code.google.com/p/keyczar/を確認してください。そのページには、その使用の簡単な例があります。

于 2012-05-03T23:46:38.153 に答える