我已经在这方面工作了很长时间,但被卡住了。
我正在编写一个 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];
慕容3067478
相关分类