iOS RSA 解密成功但解密数据似乎已损坏

标签 ios encryption cryptography

我需要实现的加密算法需要RSA加密一个triple des key。但是,我遇到了以下行为:

  1. 三重 Des 的创建没有任何问题。
  2. SecKeyGeneratePair用于生成 RSA 公钥和私钥。
  3. 三重 Des key K1 和 K2 值使用生成的公钥加密。
  4. 然后我使用 RSA 私钥解密上面创建的数据 block 。
  5. 解密成功!但是,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/

相关文章:

ios - 地址簿应该如何成为一个类的属性?

javascript - 是否有 AES 的任何客户端 Javascript/JQuery 实现?

windows - Windows Phone 8.1 中的 SHA1Managed

java - Java 中的 AES-128 加密

javascript - 为什么 Web 加密 SHA-256 会加密消息,而 SHA-512 有时会失败?

php - 使用 PHP 进行 CMAC-AES 散列

c# - Monotouch.Dialog 需要很长时间才能刷新屏幕

ios - 如何在不使用第三方 url 的情况下获取 iPhone 的公共(public) IP 地址

objective-c - 空白的第一个 UITableView 部分标题

php - Linux 服务器上的 OpenSSL 目录正常 - Windows XAMPP 上不行