当前位置: 首页 > 面试题库 >

RSA BadPaddingException:数据必须以零开头

班安平
2023-03-14
问题内容

我尝试在Java程序中实现RSA算法。我面临“ BadPaddingException:数据必须以零开头”的问题。以下是用于加密和解密我的数据的方法:

public byte[] encrypt(byte[] input)  throws Exception
{
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//
    cipher.init(Cipher.ENCRYPT_MODE, this.publicKey);
    return cipher.doFinal(input);
}

public byte[] decrypt(byte[] input)  throws Exception
{   
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");///
    cipher.init(Cipher.DECRYPT_MODE, this.privateKey);
    return cipher.doFinal(input);
}

通过以下方式从文件中读取privateKey和publicKey属性:

public PrivateKey readPrivKeyFromFile(String keyFileName) throws IOException {
    PrivateKey key = null;
    try {
        FileInputStream fin = new FileInputStream(keyFileName);
        ObjectInputStream ois = new ObjectInputStream(fin);
        BigInteger m = (BigInteger) ois.readObject();
        BigInteger e = (BigInteger) ois.readObject();
        RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
        KeyFactory fact = KeyFactory.getInstance("RSA");
        key = fact.generatePrivate(keySpec);
        ois.close();
    }
    catch (Exception e) {
       e.printStackTrace();
    }
    return key;
}

私钥和公钥的创建方式如下:

public void Initialize() throws Exception
{
    KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
    keygen.initialize(2048);
    keyPair = keygen.generateKeyPair();
    KeyFactory fact = KeyFactory.getInstance("RSA");
    RSAPublicKeySpec pub = fact.getKeySpec(keyPair.getPublic(), RSAPublicKeySpec.class);
    RSAPrivateKeySpec priv = fact.getKeySpec(keyPair.getPrivate(), RSAPrivateKeySpec.class);

    saveToFile("public.key", pub.getModulus(), pub.getPublicExponent());
    saveToFile("private.key", priv.getModulus(), priv.getPrivateExponent());
}

然后保存在文件中:

public void saveToFile(String fileName, BigInteger mod, BigInteger exp) throws IOException {
    FileOutputStream f = new FileOutputStream(fileName);
    ObjectOutputStream oos = new ObjectOutputStream(f);
    oos.writeObject(mod);
    oos.writeObject(exp);
    oos.close();
}

我不知道问题是怎么来的。任何帮助将不胜感激!

提前致谢。


问题答案:

原则上,代码看起来还可以-
我将进行一些登录以确保所生成的密钥是真正从文件中读取的密钥(您所做的事情并不像使用新密钥生成数据那样愚蠢,然后例如尝试用旧的阅读它?)



 类似资料:
  • 我用RSA实现了数据加密/解密。如果我只是在本地加密/解密,它可以工作,但是如果我发送加密的数据,我会得到BadPaddingException:数据必须从零开始。 为了通过网络发送数据,我需要在客户端将数据从字节数组改为字符串(我以报头的形式发送),然后在服务器端检索数据并将其改回字节数组。 这里是我的本地加密/解密代码(我使用私钥加密,使用公钥解密): DecryptedString和mess

  • 问题内容: 嘿,我不断出现错误: 索引(从零开始)必须大于或等于零且小于参数列表的大小。 我的代码: 问题答案: 你的第二个用途是一个占位符,但你只传递一个参数,所以你应该使用来代替。 更改此: 对此:

  • JSONException:JSONObject文本必须以字符6处的{开头。

  • 我有一个来自REST服务的JSON: 我正在使用java-json.jar来解析这个JSON,这是我试图传递到JSON字符串上方的简单片段: 但我得到了下面的例外: 首先,我假设这是因为JSON中的和字符,并尝试替换如下: 但即便如此,我也遇到了同样的例外。谁能指导我知道我做错了什么吗?

  • 我正在尝试解析一些json,这样我就可以得到json的不同部分。当我使用以下代码时 我得到了一个错误: 你知道为什么我会犯这个错误吗?我能够用在线json验证器验证json

  • 我正在JSBin上玩ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,它就不起作用。 例如,以下内容不会呈现: 但只要我用替换它就会呈现。 我不能用小字母开始标签有什么原因吗?

  • 问题内容: 我有一个JSON文件,我正在尝试处理,但出现以下错误: 线程“主” org.json.JSONException中的异常:JSONObject文本必须在org.json.JSONObject的org.json.JSONTokener.syntaxError(JSONTokener.java:433)的1 [字符2行1]处以“ {”开头。(JSONObject.java:195)位于or

  • 问题内容: 我正在使用JSBin上的ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,那么它将不起作用。 例如,以下内容不呈现: 但是,一旦我替换为,它就会渲染。 我不能以小写字母开头的标签有原因吗? 问题答案: 在JSX中,小写标签名称被认为是HTML标签。但是,带点号(属性访问器)的小写标记名称不是。 参见HTML标签与React组件。 编译为(html标记) 编译为 编译为