首页 > 解决方案 > 由 Java AES 加密的字符串,在 Python 问题中解密

问题描述

我有一个 Java 代码来加密(使用密钥的 AES 加密)JSON 并将其存储在 Oracle 数据库 LONG RAW 列中。

我有一个 python 代码来读取该列中的数据并解密。以下是我用于解密的代码。

代码运行良好,但解密后我看不到 JSON,而是打印了一些不可读的字符串。

c = conn.cursor()
c.execute(u'select KEY_VALUE from TEST1')
encoded = "";

for row in c:
    encoded = base64.b64encode(row[0])

print(encoded)
key = 'F50D518354690A8630BCE683B7AC8F55'

aes = AES.new(key, AES.MODE_CBC, 16 * b'\0')

print(aes.decrypt(encoded))

conn.close()

你能指出我错在哪里吗?

编码字符串也打印得很好,并且与 Oracle 数据库中的值相匹配。

我尝试使用 AES.MODE_ECB,因为 java 代码不是 iv 加密但仍然是同样的问题

下面是java中的加解密代码。我想在 python 中复制解密。

解密

public static  String decryptText(byte[] byteCipherText, SecretKey secKey) throws Exception {

                // AES defaults to AES/ECB/PKCS5Padding in Java 7

                System.out.println(secKey.toString());

                Cipher aesCipher = Cipher.getInstance("AES");

                aesCipher.init(Cipher.DECRYPT_MODE, secKey);

                byte[] bytePlainText = aesCipher.doFinal(byteCipherText);

                return new String(bytePlainText);

            }

加密

public static byte[] encryptText(String plainText, String key) throws Exception {

                    // AES defaults to AES/ECB/PKCS5Padding in Java 7

                    System.out.println("key is "+key);
                    SecretKey secKey=decodeKeyFromString(key);

                    Cipher aesCipher = Cipher.getInstance("AES");

                    aesCipher.init(Cipher.ENCRYPT_MODE, secKey);

                    byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());

                    return byteCipherText;

                }

decodeKeyFromString 方法只有下面一行:

 SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

我什至尝试在 oracle 中将加密值写入 blob,然后进行解密,但仍然是相同的垃圾值。

for row in c:
            encoded=row[0]

        encrypted= open(blobpath,'wb')

        encrypted.write(encoded.read())

        encrypted.close()

        with open('encrypted.txt', 'r') as myfile:
            data=myfile.read().replace('\n', '')

        key='F50D518354690A8630BCE683B7AC8F55'

        aes = AES.new(key, AES.MODE_ECB)

        e=unpad(aes.decrypt(base64.b64encode(data)))

标签: javapythonaescx-oraclepycrypto

解决方案


推荐阅读