我使用SwiftyRSA
用带有PKCS1
填充的公钥加密字符串。不幸的是,当我在 Java 解密我的加密字符串时,我发现了BadPadding: Encryption Error
。到目前为止,我发现Java使用Mode
来加密/解密字符串,但在iOS/Swift中没有Mode
。请让我知道我应该使用哪种算法在 Swift 和 Java 之间进行加密/解密。
这是用于加密/解密的公共和私钥
https://github.com/ppshein/Encrypt-Decrypt
快速加密
let publicKey = try PublicKey(pemNamed: "public")
let clear = try ClearMessage(string: inString, using: .utf8)
let encrypted = try clear.encrypted(with: publicKey, padding: .init(rawValue: 0))
let base64 = encrypted.data.base64EncodedString()
要解密的爪哇
public class CryptographyUsingKeystore {
private static final String ALGORITHM = "RSA";
public static byte[] encrypt(PublicKey publicKey, byte[] inputData)
throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.PUBLIC_KEY, publicKey);
byte[] encryptedBytes = cipher.doFinal(inputData);
return encryptedBytes;
}
public static byte[] decrypt(PrivateKey privateKey, byte[] inputData)
throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.PRIVATE_KEY, privateKey);
byte[] decryptedBytes = cipher.doFinal(inputData);
return decryptedBytes;
}
public static void main(String[] args) throws Exception {
KeyProvider keyProvider = new KeyProvider();
PublicKey publicKey = myKey.getPemPublicKey();
//PrivateKey privateKey = (PrivateKey) keyProvider.getPrivateKey();
byte[] encryptedData = encrypt(publicKey,
"Hello".getBytes());
System.out.println("Encrypted Key.... ");
System.out.println(new String(Base64.getEncoder().encode(encryptedData)));
byte[] decryptedData = decrypt(privateKey, encryptedData);
System.out.println("Decrypted key.... ");
System.out.println(new String(decryptedData));
}
}
Java crypto(JCA)使用称为转换(或只是转换)的语法算法/模式/填充来指定所有密码。如果仅指定算法,则默认为模式和填充。对于 RSA,没有实际的操作模式,转换中的模式 (ECB) 只是一个占位符,以符合固定语法。但是有明显不同的填充方案。
我不是 Swift 的人,但从文档中我可以看出,0 实际上是 sigRaw,而 PKCS1 是 1。 如果是这样,您正在使用"raw"=没有对应于Java的NoPadding的填充进行加密,因此使用Java默认PKCS1Padding解密将失败。试试"RSA/ECB/NoPadding"
.或者更好的是,使用 PKCS1 加密并使用PKCS1 解密(显式或默认),因为......
警告:没有填充的 RSA 加密在语义上始终不安全,并且取决于您如何使用它,通常完全不安全(例如,攻击者可以快速解密您的所有数据)。这正是它不是默认值和不推荐的原因。但是,安全性不是堆栈溢出的主题;这是加密的主题。SX 和安全性。SX已经有许多Q和As解释了无填充(又名"教科书"或"天真"RSA加密)的危险。