BadPadding:加密在java解密加密字符串时出错

时间:2018-03-21 04:03:47

标签: java swift encryption badpaddingexception

我使用SwiftyRSA加密带有PKCS1填充的公钥的字符串。不幸的是,当我在Java解密我的加密字符串时,我发现BadPadding: Encryption Error。到目前为止,我发现Java使用Mode来加密/解密字符串,但iOS / Swift中没有Mode。请让我知道我应该使用哪种算法来加密/解密Swift& Java的。

这是Public&加密/解密的私钥

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()

要解密的Java

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));
    }
}

1 个答案:

答案 0 :(得分:2)

Java加密(JCA)使用语法算法/ mode / padding called a transformation(或只是转换)来指定所有密码。如果仅指定算法,则默认模式和填充。 对于RSA,没有实际的操作模式,转换中的模式(ECB)只是一个符合固定语法的占位符。但是填充方案有很大不同。

我不是斯威夫特人,但是it appears to me from the doc 0实际上是sigRaw,而PKCS1是1。 如果是这样,您正在使用' raw'进行加密。 =没有与Java的NoPadding对应的填充,因此使用Java默认PKCS1Padding进行解密将失败,因为您找到了。试试"RSA/ECB/NoPadding"。或者更好,使用PKCS1 进行加密并使用PKCS1(明确地或默认情况下)解密,因为......

警告:没有填充的RSA加密在语义上总是不安全的,并且取决于您使用它的方式通常是完全不安全的(例如,攻击者可以快速解密所有数据)。这正是它不是默认值而不推荐的原因。但是,安全性不是stackoverflow的主题;这是crypto.SX和security.SX的主题,其中有许多Qs和As解释unpadded aka'教科书的危险'或者“天真的”#39; RSA加密。