gpt4 book ai didi

Java RSA 解密 - 摆脱填充值

转载 作者:行者123 更新时间:2023-11-30 03:43:10 24 4
gpt4 key购买 nike

我有一个关于使用 RSA 算法解密消息的问题。

我使用 PKCS1Padding。

我对字符串进行编码,例如“MyTestString”,但是在解码时我得到“MyTestString”+很多值

当然我知道这些值是通过填充算法添加的零,这样就可以了。

但我认为解密机制会消除这些零并返回我的纯文本。

我是否遗漏了一些重要的东西或者我的假设是错误的?

这是我负责编码和解码的代码。注意:我将纯文本分成相等长度的 block ,每个 block 都单独加密/解密,然后粘合/分割在一起

( keyMode 为 1024 )用于加密的代码

byteArrayMessage = plainMessage.getBytes(ENCODING);
int keySize = keyMode;
int maxBlockSize = (keySize / 8 - 11);
int blocksCount = (int) Math.ceil((double) byteArrayMessage.length / maxBlockSize);
byte[][] blocksCollection = new byte[blocksCount][];
KeyFactory kf = null;
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(ConvertData.hexStringToByteArray(hexPubliKey));
PublicKey pubKey = null;
kf = KeyFactory.getInstance("RSA");
pubKey = kf.generatePublic(pubSpec);
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

// encoding
byte[] encrypted = null;
int i = 0;
int startIndex;
int endIndex;
int sizeOfBlocks = 0;
while (i < blocksCount) {
startIndex = i * (maxBlockSize);
endIndex = startIndex + maxBlockSize;
try {
encrypted = cipher.doFinal((Arrays.copyOfRange(byteArrayMessage, startIndex, endIndex)));
sizeOfBlocks += encrypted.length;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
blocksCollection[i] = encrypted;
i++;
}


i = 0;
int n = blocksCollection.length;
String gluedEncodedData = "";
String encodedChunk;
while (i < n) {
encodedChunk = (ConvertData.byteArrayToHexString(blocksCollection[i]));
gluedEncodedData += encodedChunk;
i++;
}
Logger.trace("Glued Encoded data " + gluedEncodedData);
return gluedEncodedData;

用于解密的代码

  PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(ConvertData.hexStringToByteArray(hexPrivateKey));
KeyFactory kf;
PrivateKey privateKey;
Cipher cipher;
kf = KeyFactory.getInstance("RSA");
privateKey = kf.generatePrivate(privSpec);
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

byte[] encryptedBytes = ConvertData.hexStringToByteArray(hexEncodedData);
int keySize = keyMode;
int blockSize = (keySize / 8);

int blocksCount = encryptedBytes.length / blockSize;
int i = 0;
int n = blocksCount;
int startIndex;
int endIndex;
byte[] byteChunkData;
byte[] decryptedChunk;
byte[] decryptedMessage = new byte[0];
while (i < n) {
startIndex = i * (blockSize);
endIndex = startIndex + blockSize;
byteChunkData = Arrays.copyOfRange(encryptedBytes, startIndex, endIndex);
decryptedChunk = cipher.doFinal(byteChunkData);
decryptedMessage = concatenateByteArrays(decryptedMessage, decryptedChunk);
i++;
}
String plainText = new String(decryptedMessage, ENCODING);
return plainText;

最佳答案

直接的问题是加密过程中的以下行:

encrypted = cipher.doFinal((Arrays.copyOfRange(byteArrayMessage, startIndex, endIndex)));

因为 endIndex 可以大于数组的大小。因此,您应该使用 endIndex 和数组实际大小中的最小值。

但是,您应该使用混合加密系统(混合 AES 和 RSA)。请注意,仅串联 RSA 加密有许多缺点,例如 CPU 使用率高和密文开销较大,并且不能为您提供完整性。另请注意,最好使用 OAEP 加密而不是 PKCS#1 兼容加密。

关于Java RSA 解密 - 摆脱填充值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26367225/

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