因此,这种特殊的异常非常常见,但我的问题与通常被问到的略有不同。
我有一个AES解密和加密函数,定义如下:
public static byte[] encrypt(byte[] ivBytes, byte[] keyBytes, byte[] textBytes)
throws java.io.UnsupportedEncodingException,
NoSuchAlgorithmException,
NoSuchPaddingException,
InvalidKeyException,
InvalidAlgorithmParameterException,
IllegalBlockSizeException,
BadPaddingException {
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(keyBytes, "AES");
Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return cipher.doFinal(textBytes);
}
public static byte[] decrypt(byte[] ivBytes, byte[] keyBytes, byte[] textBytes)
throws java.io.UnsupportedEncodingException,
NoSuchAlgorithmException,
NoSuchPaddingException,
InvalidKeyException,
InvalidAlgorithmParameterException,
IllegalBlockSizeException,
BadPaddingException {
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return cipher.doFinal(textBytes);
}
现在,如果我像这样执行单个解密:
System.out.println(Arrays.toString(
AES256Cipher.decrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(aKeys[a]),
AES256Cipher.encrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(aKeys[a]),
AES256Cipher.encrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(bKeys[b]), HexBytePlainWriter.hexStringToByteArray(zkeys[a^b]))
)
)));
字节数组输出很好。而如果我执行双重加密/解密:
System.out.println("dec: " + HexBytePlainWriter.ByteToHexString(
AES256Cipher.decrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(aKeys[a]),
AES256Cipher.decrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(bKeys[b]),
AES256Cipher.encrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(aKeys[a]),
AES256Cipher.encrypt(ivBytes, HexBytePlainWriter.hexStringToByteArray(bKeys[b]), HexBytePlainWriter.hexStringToByteArray(zkeys[a^b]))
)
))));
我得到了著名的<code>javax.crypto。BadPaddingException:给定的最终块未正确填充异常。请注意,a
和b
只是整数(假设它们都是0)。目前,IVBytes只是一个大小为16的空字节数组,用newbyte[16]
声明。和<code>aKeys</code>和<code<bKeys</code>都是带有AES编码(随机)字符串(长度32字节)的字符串数组。
这些是我使用的助手函数(将byte[]转换成十六进制字符串,反之亦然):
public static String ByteToHexString (byte[] data) {
StringBuilder buf = new StringBuilder();
for (byte b : data) {
int halfbyte = (b >>> 4) & 0x0F;
int two_halfs = 0;
do {
buf.append((0 <= halfbyte) && (halfbyte <= 9) ? (char) ('0' + halfbyte) : (char) ('a' + (halfbyte - 10)));
halfbyte = b & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
我怀疑第一次解密的输出使密文格式不正确,以至于外部部分抛出异常。我已经检查了大小,外部输出32字节,所以应该没问题。这不符合 PKC5 填充?
任何帮助都非常感谢。
看起来我的最小示例是错误的:我首先使用了键B而不是A。Jon Skeet确实给了我一个想法。如果我有任何新的东西,我会编辑。
这个想法是正确的。我在一个混乱的真值表中循环(如果有兴趣,可以查看这篇维基百科文章)并检查所有可能的密文(CT)。问题是,如果您选择了一个不正确的ct并对它使用双重解密,它将抛出异常,因为第一次解密返回垃圾。对表中的键进行简单的检查就可以解决这个问题。
你用错了解密密钥。你用密钥B加密,然后用密钥a加密结果,然后用密钥B解密结果,用密钥a解密最终结果。
每次解密时,都应该指定用于执行“最近”加密操作的同一密钥。所以:
Encrypt Encrypt Decrypt Decrypt
with B with A with A with B
Plain text -> encrypted I -> encrypted II -> encrypted I -> plain text
我还建议一次一条语句地执行这些操作,而不是因为要在一条语句中做所有的事情而必须从下往上读,这样会更容易理解发生了什么。
我尝试在服务器上进行gpg加密/解密,对于加密,我使用以下命令行: 我想要找到原因:同一个用户有2个不同的密钥和1个秘密密钥。但现在又出现了一个问题:我删除了错误的键,并再次进行相同的测试。 解密后的答案是: 您需要一个密码短语来解锁用户的密钥:“Droli Mail_Adress”2048位RSA密钥,ID 6D2F1BE9,创建2017-07-19(主密钥ID 09C41BAC) 没有关于gp
我有一个问题与ADFS身份验证,因为我升级了Spring启动版本从2.2.5。释放到2.5. x 在新版本中,我收到以下错误消息:未能解密EncryptedData 依赖性: SAML请求 重新分析:/ SAML请求: 西格尔:http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 2.vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
在大多数情况下,这一过程取得了成功。但RSACryptoServiceProvider将引发一个异常: 错误似乎是随机出现的。 下面是一些jsencrypt可以加密和解密,但C#解密失败的例子。每个数组的前两个元素是源数据和JSEncrypt解密的数据。每个数组的最后一个元素是C#无法解密的加密数据。 下面是解密数据的C#代码示例: 下面是加密数据的js代码示例:
我正在尝试使用在我的设备上生成的RSA密钥解密我的android应用程序中的字符串。加密由php服务完成,使用我的应用程序提供的公共rsa密钥。我的问题是解密,解密失败了。 我正在做以下工作: 在用base64.encode(pubkey.getencoded())和私钥进行“base64”编码后,这两个密钥(公共和私有)都保存到文件中。->好 当我调用我的webservice时,我在post变量
我做了第一次测试。1.我在ApplicationMain.java中使用了@PropertySource(“classpath:sampleservices.yml”)或@PropertySource(“classpath:sampleservices.properties”)。2.我将ENC()密码保存在一个单独的文件(sampleservices.yml或sampleservices.prop
我正在尝试用python中的pycrypto加密/解密。在大多数情况下,事情进展顺利,但在解密数据时,我遇到了一个奇怪的问题。我尝试对一些JPG进行加密/解密以进行测试,尽管它们加密/解密没有问题,但解密的文件无法打开/已损坏。为了找到问题,我保存了一个文本文件,其中有一个类似于“测试这个文件的完整性”之类的随机句子,它只有在“…完整性”之类的内容之后才能正确解密,完整性之前的所有内容仍然是乱码。