javax.crypto.BadPaddingException : Data must start with zero

标签 java security rsa encryption

首先,这不是一个重复的问题。我面临一个非常奇怪的问题。

以下是我所做的。

情况1:

  1. 生成 key 对
  2. 使用私钥加密
  3. 使用公钥解密

一切正常。

情况2:

  1. 从 Mozila Firefox keystore 加载证书
  2. 使用证书 A
  3. 使用证书 A 的私钥进行加密
  4. 使用证书 A 的公共(public) Keu 进行解密

一切正常。

情况3:

  1. 从 Internet Explorer key 存储加载证书
  2. 使用证书 A
  3. 使用证书 A 的私钥进行加密
  4. 使用证书 A 的公共(public) Keu 进行解密

在解密时,我收到 BadPadding 异常错误

以下是我的每个代码的片段。

生成 key 对

    KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair(); 
    PublicKey publicKey = keyPair.getPublic();
    PrivateKey privateKey = keyPair.getPrivate();

加载 Mozilla keystore

    String strCfg = System.getProperty("user.home")+ File.separator + "jdk6-nss-mozilla.cfg";
    Provider p1 = new sun.security.pkcs11.SunPKCS11(strCfg);
    Security.addProvider(p1);
    keyStore = KeyStore.getInstance("PKCS11");
    keyStore.load(null, "password".toCharArray());

配置文件内容

name=NSS
slot=2
library=C:/Program Files/Mozilla Firefox/softokn3.dll
nssArgs="configDir='C:/Documents and Settings/pratik.vohera.DIGI-CORP/Application Data/Mozilla/Firefox/Profiles/t48xsipj.default' certPrefix='' keyPrefix=''     secmod='secmod.db' flags=readOnly"

加载 IE keystore

    keyStore = KeyStore.getInstance("Windows-MY");
    keyStore.load(null, null);

从 KeyStore 获取公钥和私钥

    if (keyStore != null) {
    Enumeration<String> enumaration = null;
    try {
        enumaration = keyStore.aliases();
    } catch (KeyStoreException e1) {
        e1.printStackTrace();
    }
    ArrayList<String> certiList;
    while (enumaration.hasMoreElements()) {
        String aliases = enumaration.nextElement();
        certiList = new ArrayList<String>();
        certiList.add(aliases);
        try {
            selectedCert = keyStore.getCertificate(aliases);
            selectedpublickey = (RSAPublicKey) selectedCert.getPublicKey();
            selectedAlias = aliases;
            selectedprivateKey = (PrivateKey) keyStore.getKey(selectedAlias, null);}
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
    }

加密

private static String publicEncrypt(String text, Key pubKey) throws Exception {
    BASE64Encoder bASE64Encoder = new BASE64Encoder();
    byte[] plainText = text.getBytes();
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String encryptedText = bASE64Encoder.encode(cipher.doFinal(plainText));
return encryptedText;
}

解密

private static String privateDecrypt(String text, Key priKey)throws Exception     {
    BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] encryptText = base64Decoder.decodeBuffer(text);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, priKey);
String decryptedString = new String(cipher.doFinal(encryptText));
return decryptedString;
}

异常堆栈跟踪

javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at test.testclass.privateDecrypt(testclass.java:198)
at test.testclass.test(testclass.java:137)
at test.testclass.main(testclass.java:120)

我已经为此工作了很长时间。这个非常重要。如果需要任何进一步的信息,请告诉我。

最佳答案

在第三种情况下,问题是:您尝试使用私钥加密并使用公钥解密,这是错误的。您应该始终使用私钥解密。

关于javax.crypto.BadPaddingException : Data must start with zero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856476/

相关文章:

java - Play.current 已弃用 - 在 Controller 使用的类中加载文件(Java Play Framework 2.7)?

security - MonoTouch - 如何使用 SecKeyChain.QueryAsRecord() 获取证书列表?

android - 在 iOS 上生成的 RSA key 不适用于 Android

java - 如何在给定字符串的特定位置插入十六进制字节

java - 创建实现 Matlab 接口(interface)的 Java 对象

没有身份验证的 WCF 传输安全性

java - 重定向到 https 的不同域

java - 使RSA加密Java程序独立于平台

java - RSA加解密: BadPaddingException : Data must start with zero

java - 我运行了这个 junit 测试,但它失败了,怎么了?