问题描述
我正在构建一个快速的应用程序,其中我需要使用AES / CBC / PKCS5PADDING加密类型。加密API参数并解密API响应。
我已经成功添加了android java,并且工作正常。 现在,我试图快速实现相同的加密类型'AES / CBC / PKCS5PADDING'密码大小16。
问题:对于Android和iOS,我得到的加密结果不同
示例: 字符串:嗨,你好吗
适用于Android的加密字符串: + A3p093WWrXU3Ey9i / Lv1Q ==
用于swift(iOS)的加密字符串: Bp23PQX6yaCghvKFTieJDw ==
快速实施
import Foundation
import CommonCrypto
func aesEncrypt(key: String,iv: String,message: String) throws -> String{
let data = message.data(using: .utf8)!
// let enc = try AES(key: key,iv: iv,padding: .pkcs5).encrypt([UInt8](data))
let enc = try AES(key: Array(key.utf8),blockMode: CBC(iv: Array(iv.utf8)),padding: .pkcs5).encrypt([UInt8](data))
let encryptedData = Data(enc)
return encryptedData.base64EncodedString()
}
func aesDecrypt(key: String,message: String) throws -> String {
let data = NSData(base64Encoded: message,options: NSData.Base64DecodingOptions(rawValue: 0))!
let dec = try AES(key: key,padding: .pkcs5).decrypt([UInt8](data))
let decryptedData = Data(dec)
return String(bytes: decryptedData.bytes,encoding: .utf8) ?? "Could not decrypt"
}
Android实现
package com.example.uribanew.utils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class EncrytData {
private static String CIPHER_NAME = "AES/CBC/PKCS5PADDING";
private static int CIPHER_KEY_LEN = 16; //128 bits
private static String KEY = ""; // key to use should be 16 bytes long (128 bits)
private static String IV = ""; // initialization vector
/**
* Encrypt data using AES Cipher (CBC) with 128 bit key
*
* @param data - data to encrypt
* @return encryptedData data in base64 encoding with iv attached at end after a :
*/
public static String encrypt(String data) {
try {
IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes("UTF-8"));
SecretKeySpec secretKey = new SecretKeySpec(fixKey(KEY).getBytes("UTF-8"),"AES");
Cipher cipher = Cipher.getInstance(EncrytData.CIPHER_NAME);
cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivSpec);
byte[] encryptedData = cipher.doFinal((data.getBytes()));
String encryptedDataInBase64 = android.util.Base64.encodetoString(encryptedData,android.util.Base64.DEFAULT); //Base64.getEncoder().encodetoString(encryptedData);
return encryptedDataInBase64;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
private static String fixKey(String key) {
if (key.length() < EncrytData.CIPHER_KEY_LEN) {
int numPad = EncrytData.CIPHER_KEY_LEN - key.length();
for (int i = 0; i < numPad; i++) {
key += "0"; //0 pad to len 16 bytes
}
return key;
}
if (key.length() > EncrytData.CIPHER_KEY_LEN) {
return key.substring(0,CIPHER_KEY_LEN); //truncate to 16 bytes
}
return key;
}
/**
* Decrypt data using AES Cipher (CBC) with 128 bit key
*
* @param data - encrypted data with iv at the end separate by :
* @return decrypted data string
*/
public static String decrypt(String data) {
try {
IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes("UTF-8"));
// SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes("UTF-8"),"AES");
SecretKeySpec secretKey = new SecretKeySpec(fixKey(KEY).getBytes("UTF-8"),"AES");
Cipher cipher = Cipher.getInstance(EncrytData.CIPHER_NAME);
cipher.init(Cipher.DECRYPT_MODE,ivSpec);
byte[] decodedEncryptedData = android.util.Base64.decode(data,android.util.Base64.DEFAULT); //Base64.getDecoder().decode(parts[0]);
byte[] original = cipher.doFinal(decodedEncryptedData);
return new String(original);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
请让我知道为什么使用相同的加密类型时,对于Android和iOS却获得不同的加密字符串。让我知道我在做什么错
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)