猿问

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

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


我正在编写一个 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];



绝地无双
浏览 197回答 1
1回答

慕容3067478

我的建议是使用RNCryptor,有一个iOS和一个Go实现可用。RNCryptor 结合了您需要的所有必要的加密原语,包括:AES-256 加密(高级加密标准)CBC 模式(密码块链)使用 PBKDF2 进行密码拉伸(基于密码的密钥派生函数 2)密码盐渍随机 IV(初始化向量)加密然后散列 HMAC(身份验证)它已被广泛部署和审查。密码学很容易出错,使用 RNCryptor 将避免潜在的陷阱。如果我有你的加密需求,我会使用它。
随时随地看视频慕课网APP

相关分类

Go
我要回答