gpt4 book ai didi

java - 使用 AES/ECB/NoPadding 加密和解密不会给出相同的纯文本

转载 作者:行者123 更新时间:2023-11-30 04:28:41 29 4
gpt4 key购买 nike

String plain1= "Test";
byte[] cipher = SplashSecure.getInstance().encrypt2(plain1);
String plain2 = SplashSecure.getInstance().decrypt2(cipher);

plain = Test������������������������

解密后plainText2应等于plaintext。但事实并非如此。

加密/解密方法。

 public void initKey(String key) {
String paddedKey = Utils.padString(key);
mKeyspec = new SecretKeySpec(Utils.getBytes(paddedKey), "AES/ECB/NoPadding");
// Utils.getBytes returns "paddedKey.getBytes("CP1252")"
}

public byte[] encrypt2(String data) {
try {
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, mKeyspec);
String paddedData = Utils.padString(data);
return cipher.doFinal(Utils.getBytes(paddedData));

} catch(InvalidKeyException e) {
e.printStackTrace();
// Series of catch blocks
}
return null;
}

public String decrypt2(byte[] cypherText) {
try {
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
byte[] plainTextBytes = cipher.doFinal(cypherText);
return Utils.getString(plainTextBytes);
// Utils.getString returns "new String(bytes, "CP1252");"
} catch(InvalidKeyException e) {
// Series of catch blocks.
}
return null;
}

编辑

public static String padString(String source) {
char paddingChar = '\0';
int size = 16;
int padLength = size - source.length() % size;

for (int i = 0; i < padLength; i++) {
source += paddingChar;
}

return source;
}

编辑

我正在尝试跨 Windows(其他加密客户端和服务器)和 Android 进行加密解密。 Windows 客户端是一个使用 Rijndael 类 ( http://svn.openfoundry.org/pcman/2007.06.03/Lite/Rijndael.h ) 的 VC++ 应用程序,Android 使用 http://www.cs.ucdavis.edu/~rogaway/ocb/ocb-java/Rijndael.java 。 Windows客户端已将数据加密并存储在服务器上。我需要为 android 构建一个客户端来获取加密数据,解密并显示给用户。

我确信我使用了正确的 key 来解密。

最佳答案

AES 的 block 大小为 128 位(即 16 字节)。它只能处理这种大小的 block 中的数据,因此即使您告诉它使用NoPadding,它也无法遵守。

这里最有可能发生的事情是,您使用的 AES 实现在内部将输入的 4 个字节填充到 16 个字节,并对结果进行加密。当您解密时,您会得到相同的 16 个字节,即“T”、“e”、“s”、“t”和 12 个垃圾字节。

您看到的输出支持这一点:“Test”后跟 24 个 ? 符号。我不知道为什么它为每个垃圾字节打印两个 ? 符号,但我猜测这与解释 unicode 中的垃圾字节有关。您可以通过打印解密 blob 的原始字节值来了解发生了什么。

简短的回答是“NoPadding”对于分组密码没有意义(或者更确切地说,如果您要使用 NoPadding,那么您必须自己填充和取消填充)。

关于java - 使用 AES/ECB/NoPadding 加密和解密不会给出相同的纯文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15170808/

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