我需要实现的加密算法需要RSA加密一个triple des key。但是,我遇到了以下行为:
- 三重 Des 的创建没有任何问题。
SecKeyGeneratePair
用于生成 RSA 公钥和私钥。- 三重 Des key K1 和 K2 值使用生成的公钥加密。
- 然后我使用 RSA 私钥解密上面创建的数据 block 。
- 解密成功!但是,K1 和 K2 值似乎已损坏。
下面是用于加密 K1 和 K2 数据的代码:
- (NSData *)performRsaEncryptionOnData:(NSData *)message {
size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
size_t plainBufferSize = [message length];
uint8_t *plainBuffer = (uint8_t *)calloc(plainBufferSize, sizeof(uint8_t));
uint8_t *cipherBuffer = (uint8_t *)calloc(cipherBufferSize, sizeof(uint8_t));
strncpy( (char *)plainBuffer,[message bytes], plainBufferSize);
SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainBuffer, plainBufferSize, &cipherBuffer[0], &cipherBufferSize);
return [NSData dataWithBytesNoCopy:cipherBuffer length:cipherBufferSize];
}
这是用于解密数据的代码:
- (NSData *)performRsaDecryptionForDataBlob:(NSData *)encryptedData {
size_t plainTextBufferSize = 128;
size_t cipherBufferSize = [encryptedData length];
uint8_t *cipherBuffer = (uint8_t*)[encryptedData bytes];
uint8_t *plainBuffer = (uint8_t *)calloc(plainTextBufferSize, sizeof(uint8_t));
SecKeyDecrypt(privateKey, kSecPaddingPKCS1,cipherBuffer,cipherBufferSize,&plainBuffer[0],&plainTextBufferSize);
return [NSData dataWithBytesNoCopy:plainBuffer length:plainTextBufferSize];
}
这是我在 RSA 加密之前得到的结果:K1K2 = <54b86c29 f9766b00 d90a6c51 1a80026a>
,解密后这是我们所拥有的:K1K2 = <54b86c29 f9766b00 00000000 00000000>
.坦率地说,我不完全确定为什么会这样。有什么想法吗?
最佳答案
strncpy(..)
不适用于二进制数据。您的 key 包含 0 并且 strncpy(..)
停止复制 key 的其余部分。
K1K2 = <54b86c29 f9766b00 d90a6c51 1a80026a>
^^
关于iOS RSA 解密成功但解密数据似乎已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219823/