gpt4 book ai didi

java - Python AES解密

转载 作者:太空狗 更新时间:2023-10-30 01:07:52 25 4
gpt4 key购买 nike

我有以下 Java 代码,我想在 Python 中复制。

public class AESDecryption {

protected SecretKeySpec getPublicKey() {

try {
byte[] key = "MuidKeibimbtjph9".getBytes("UTF-8");
key = MessageDigest.getInstance("SHA-256").digest(key);
key = Arrays.copyOf(key, 32);
return new SecretKeySpec(key, "AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}

public String decrypt(byte[] data) {
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(2, new SecretKeySpec(getPublicKey().getEncoded(), "AES"), new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte decryptedBytes[] = cipher.doFinal(data);
return new String(Arrays.copyOf(decryptedBytes, decryptedBytes.length - decryptedBytes[-1 + decryptedBytes.length]));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return "";
}

public static void main(String[] args) {
try {
byte[] content = Files.readAllBytes(Paths.get("/tmp/dump.gzip"));
AESDecryption aesDecryption = new AESDecryption();
System.out.println(aesDecryption.decrypt(content));
} catch (IOException e) {
e.printStackTrace();
}
}
}

此代码来自客户端应用程序。我在生成加密内容的服务器端没有电源。对于这个问题,我更改了对称 key 以及内容的检索方式(在本例中是从文件中检索的,但实际上是从 https 响应中检索的)

我想使用 PyCrypto 库在 python 脚本中复制此功能。这是我的初始代码的样子:

from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto import Random

BLOCK_SIZE = 16
unpad = lambda s: s[0:-ord(s[-1])]

hash = SHA256.new()
hash.update('MuidKeibimbtjph9')
symmetric_key = hash.digest()
symmetric_key = symmetric_key[:32]

bytes_store = None
with open('/tmp/dump.gzip','r') as f:
bytes_store = f.read()

rndfile = Random.new()
aes_decryptor = AES.new(symmetric_key, AES.MODE_CBC, rndfile.read(BLOCK_SIZE))
print unpad(aes_decryptor.decrypt(bytes_store))

在加密文件上运行 java 代码工作正常。结果看起来像:

{"code":200,"status":"ok","api_version":"0.0.0","data":[.....],"notifications":{}}

但是 python 复制会转储“半解密”文本。有点……

=c�q[A�$�dl�tus":"ok","api_version":"0.0.0","data":[.....],"notifications":{}}

我什么也做不了。看Java代码很明显密码 block 没有填充,所以我想可能服务器端的数据已经是密码 block 大小的倍数了。在 python 输出的末尾也有很多 ▯▯▯ 字符,但我通过解填充解密数据很快摆脱了它们。尽管如此,我还是不知道我做错了什么,有效载荷的第一部分被加扰了。我对数据加密的了解非常基础,因此我向您寻求知识:)

最佳答案

问题是服务器代码使用固定的 IV(这是错误的),其中包含零,但在您的 Python 代码中,您将一个新的随机生成的 IV 传递给 AES.new

您可以将 rndfile.read(BLOCK_SIZE) 替换为 "\x00"*BLOCK_SIZE

关于java - Python AES解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com