为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
绝地无双 2021-11-08 16:52:21
我已经在这方面工作了很长时间,但被卡住了。我正在编写一个 iOS 应用程序,它从 Go 服务器端应用程序中获取 AES 加密数据并对其进行解密。我在 iOS 端使用 CCCryptor 进行解密。但是,对于我的一生,我无法获取明文。有一个可用的 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];
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

我的建议是使用RNCryptor,有一个iOS和一个Go实现可用。

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

  • AES-256 加密(高级加密标准)

  • CBC 模式(密码块链)

  • 使用 PBKDF2 进行密码拉伸(基于密码的密钥派生函数 2)

  • 密码盐渍

  • 随机 IV(初始化向量)

  • 加密然后散列 HMAC(身份验证)

它已被广泛部署和审查。

密码学很容易出错,使用 RNCryptor 将避免潜在的陷阱。

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


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信