使用在Objective中使用CFB加密的Objective-C中的CCCryptor解密数据

时间:2015-09-21 03:25:32

标签: ios objective-c encryption go cryptography

我已经在这方面工作了很长时间,但我被卡住了。

我正在编写一个iOS应用程序,它将AES加密数据从Go服务器端应用程序中解密出来。我正在使用CCCryptor在iOS端进行解密。但是,对于我的生活,我不能得到明文。有一个有效的Java / Android实现,它在Go方面解密很好,所以我很确定它与我的CCCryptor设置有关。

我实际上在解密时获得了0成功状态,但是获取输出并执行NSString initWithBytes会给我一个空字符串。

注意:我只是在编写iOS端。

转到加密的代码:

func encrypt(key, text []byte) []byte {

  block, err := aes.NewCipher(key)
  if err != nil {
    panic(err)
  }

  b := encodeBase64(text)
  ciphertext := make([]byte, aes.BlockSize+len(b))
  iv := ciphertext[:aes.BlockSize]
  if _, err := io.ReadFull(rand.Reader, iv); err != nil {
    panic(err)
  }

  cfb := cipher.NewCFBEncrypter(block, iv)

  cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))

  return ciphertext
}

解密的Objective-C代码

+ (NSData *)decrypt:(NSData*)data withPassword:(NSString*)password{


NSData * key = [password dataUsingEncoding:NSUTF8StringEncoding];

size_t dataLength   = [data length] - kCCBlockSizeAES128;
NSData *iv          = [data subdataWithRange:NSMakeRange(0, kCCBlockSizeAES128)];
NSData *encrypted   = [data subdataWithRange:NSMakeRange(kCCBlockSizeAES128, dataLength)];

//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
//    size_t bufferSize = dataLength + kCCBlockSizeAES128;
//    void *buffer = malloc(dataLength);
NSMutableData *ret = [NSMutableData dataWithLength:dataLength + kCCBlockSizeAES128];

size_t numBytesDecrypted = 0;
CCCryptorStatus status = CCCrypt(kCCDecrypt, kCCAlgorithmAES,
                                 0x0000, // change to 0 solve the problem
                                 [key bytes],
                                 kCCKeySizeAES256,
                                 [iv bytes],
                                 [encrypted bytes], dataLength, /* input */
                                 [ret mutableBytes], [ret length], /* output */
                                 &numBytesDecrypted
                                 );

NSLog(@"err: %d", status);
NSLog(@"dataLength: %d, num: %d", (int)dataLength, (int)numBytesDecrypted);
if (status == kCCSuccess) {
    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return ret;
}

//    free(buffer); //free the buffer;
return nil;
}

1 个答案:

答案 0 :(得分:1)

我的建议是使用RNCryptor,可以使用iOSGo实施。

RNCryptor结合了所有必要的加密原语,满足您的需求,包括:

  • AES-256加密(高级加密标准)
  • CBC模式(密码块链接)
  • 使用PBKDF2密码拉伸(基于密码的密钥派生功能2)
  • 密码腌制
  • 随机IV(初始化向量)
  • 加密 - 然后哈希HMAC(身份验证)

它已得到广泛部署和审查。

很容易让密码学错误,使用RNCryptor可以避免潜在的陷阱。

如果我有加密需求,我会使用它。