如何将此 Java 加密代码转换为 python
How can I convert this Java encryption code to python
我试图将 java
代码转换为 python
。为此目的尝试使用 pycryptodome
库。这是 java
代码:
try {
String data= "shouldEncryptDATA";
String bas64ed= "";
int len12 = Integer.parseInt("12");
byte[] randomparam= new byte[len12];
new SecureRandom().nextBytes(randomparam);
SecretKeySpec secretKeySpec= new SecretKeySpec("1f1f7892GKG38815".getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(1, secretKeySpec, new GCMParameterSpec(Integer.parseInt("16") * 8, randomparam));
byte[] bytedata= cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
byte[] newbytearray= new byte[bytedata.length + len12];
System.arraycopy(randomparam, 0, newbytearray, 0, len12);
System.arraycopy(bytedata, 0, newbytearray, len12, bytedata.length);
bas64ed= Base64.getEncoder().encodeToString(newbytearray);
System.out.println("bas64ed: "+bas64ed);
System.out.println(URLEncoder.encode(bas64ed, "UTF-8"));
} catch (Exception unused_ex) {
System.out.println();
System.out.println("ERROR: " + unused_ex);
}
到目前为止,我尝试下面的python
代码来模仿上面的java
代码:
import base64
from Crypto.Cipher import AES
import urllib.parse
from Crypto.Random import get_random_bytes
data= "shouldEncryptDATA"
key = b '1f1f7892GKG38815'
len12 = 12
v1 = bytearray(len12)
cipher = AES.new(key, AES.MODE_GCM, nonce=get_random_bytes(12) )
ciphertext, tag = cipher.encrypt_and_digest(data.encode("utf8"))
base64ed = ""
for x in cipher.nonce, ciphertext, tag:
base64ed += base64.b64encode(x).decode('utf-8')
urlencoded = urllib.parse.quote_plus(base64ed+"\n")
print(urlencoded )
上面的 python
代码生成了一个 output
,但问题是当我将输出提供给 decryption
代码时,我得到了 MAC check Failed
。所以我意识到我在 python
代码中的实现有点问题,因为当 Java
代码的输出传递给 decryption
代码时,它可以工作并解密数据。那么如何正确地将 Java
加密代码转换为 Python
?使用 Pycryptodome
或任何其他合适的库。
Python代码中的错误在串联中,必须是:
base64ed = base64.b64encode(cipher.nonce + ciphertext + tag).decode('utf-8')
此修复后,如果将两个代码的密文与相同的输入数据(尤其是相同的 IV)进行比较,它们是相同的。
我试图将 java
代码转换为 python
。为此目的尝试使用 pycryptodome
库。这是 java
代码:
try {
String data= "shouldEncryptDATA";
String bas64ed= "";
int len12 = Integer.parseInt("12");
byte[] randomparam= new byte[len12];
new SecureRandom().nextBytes(randomparam);
SecretKeySpec secretKeySpec= new SecretKeySpec("1f1f7892GKG38815".getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(1, secretKeySpec, new GCMParameterSpec(Integer.parseInt("16") * 8, randomparam));
byte[] bytedata= cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
byte[] newbytearray= new byte[bytedata.length + len12];
System.arraycopy(randomparam, 0, newbytearray, 0, len12);
System.arraycopy(bytedata, 0, newbytearray, len12, bytedata.length);
bas64ed= Base64.getEncoder().encodeToString(newbytearray);
System.out.println("bas64ed: "+bas64ed);
System.out.println(URLEncoder.encode(bas64ed, "UTF-8"));
} catch (Exception unused_ex) {
System.out.println();
System.out.println("ERROR: " + unused_ex);
}
到目前为止,我尝试下面的python
代码来模仿上面的java
代码:
import base64
from Crypto.Cipher import AES
import urllib.parse
from Crypto.Random import get_random_bytes
data= "shouldEncryptDATA"
key = b '1f1f7892GKG38815'
len12 = 12
v1 = bytearray(len12)
cipher = AES.new(key, AES.MODE_GCM, nonce=get_random_bytes(12) )
ciphertext, tag = cipher.encrypt_and_digest(data.encode("utf8"))
base64ed = ""
for x in cipher.nonce, ciphertext, tag:
base64ed += base64.b64encode(x).decode('utf-8')
urlencoded = urllib.parse.quote_plus(base64ed+"\n")
print(urlencoded )
上面的 python
代码生成了一个 output
,但问题是当我将输出提供给 decryption
代码时,我得到了 MAC check Failed
。所以我意识到我在 python
代码中的实现有点问题,因为当 Java
代码的输出传递给 decryption
代码时,它可以工作并解密数据。那么如何正确地将 Java
加密代码转换为 Python
?使用 Pycryptodome
或任何其他合适的库。
Python代码中的错误在串联中,必须是:
base64ed = base64.b64encode(cipher.nonce + ciphertext + tag).decode('utf-8')
此修复后,如果将两个代码的密文与相同的输入数据(尤其是相同的 IV)进行比较,它们是相同的。