gpt4 book ai didi

android - Swift AES 加密抛出错误,而在 Android 中则不会

转载 作者:行者123 更新时间:2023-11-28 05:50:44 26 4
gpt4 key购买 nike

我尝试在 Swift 中进行 AES 加密,我在 Android 中这样做是这样的:

public static String Encrypt(String text, String key) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] keyBytes = new byte[16];
byte[] b = key.getBytes("UTF-8");
int len = b.length;
if (len > keyBytes.length)
len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));

return Base64.encodeToString(results, Base64.DEFAULT);

}
catch (Exception ex){return "error"+ex.getMessage();}
}

下面是 Swift 3.2 中的等效代码:

 func aesEncrypt(key: String, iv: String) throws -> String{                                   
let data = self.data(using: String.Encoding.utf8)
let enc = try AES(key: key.bytes, blockMode: BlockMode.CBC(iv: iv.bytes, padding: Padding.pkcs5).encrypt(data!.bytes)
let encData = NSData(bytes: enc, length: Int(enc.count))
let base64String: String = encData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0));
let result = String(base64String)
return result!}

在 Android 中,key 无关紧要:我可以填充任何字符串(没有长度限制)。但是当使用 Swift 时,我必须为键使用 32 个字符的字符串,为 IV 使用 16 个字符的字符串,否则它会抛出错误。

这是 Swift 的用法:

let data = "this is string which I want to be encrypted"
let key = "bbbb98232-a343-4343f-2111"
let iv = "0000000000000000" // lenght = 16 like android code
let encryptedString = data.aesEncrypt(key: key, iv: iv);

我的 Swift 代码中可能有什么错误吗?

最佳答案

您可以尝试使用以下 Swift 代码进行 AES 加密。它的字符串扩展。

import Foundation
import CommonCrypto
extension String {

func aesEncrypt(key: String, initializationVector: String, options: Int = kCCOptionPKCS7Padding) -> String? {
if let keyData = key.data(using: String.Encoding.utf8),
let data = self.data(using: String.Encoding.utf8),
let cryptData = NSMutableData(length: Int((data.count)) + kCCBlockSizeAES128) {

let keyLength = size_t(kCCKeySizeAES128)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(options)

var numBytesEncrypted: size_t = 0

let cryptStatus = CCCrypt(operation,
algoritm,
options,
(keyData as NSData).bytes, keyLength,
initializationVector,
(data as NSData).bytes, data.count,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)

if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.length = Int(numBytesEncrypted)
let base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters)
return base64cryptString
} else {
return nil
}
}
return nil
}
}

关于android - Swift AES 加密抛出错误,而在 Android 中则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53042724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com