RSA BadPaddingException: данные должны начинаться с нуля - PullRequest
2 голосов
/ 26 апреля 2010

Я пытаюсь реализовать алгоритм RSA в программе Java. Я сталкиваюсь с «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();
}

Я не могу понять, как возникла проблема. Любая помощь будет признательна!

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

В принципе, код выглядит нормально - я бы добавил, что нужно войти в систему, чтобы убедиться, что ключ, который вы генерируете, действительно тот, который затем читается из файла (вы не делаете глупостей, как генерация данных с помощью новый ключ, а затем пытается прочитать его со старым, например?)

0 голосов
/ 26 апреля 2010

До сих пор я отслеживал это до CipherSpi.engineDoFinal () . Объяснение для BadPaddingException:

[Выдается, когда] шифр находится в режиме дешифрования, и запрошено (не) заполнение, но дешифрованные данные не ограничены соответствующими байтами заполнения.

Более специфичное поведение, кажется, зависит от Spi. Вы знаете, какой Spi вы используете? Просто по умолчанию?

EDIT: К сожалению, мне трудно отследить, что такое Spi по умолчанию. Похоже, что он выбран в методе chooseFirstProvider() Cipher.java, строки с 644 по 721 здесь . Если у вас есть удобный отладчик, вы можете узнать, какой у вас Spi, а затем проверить документацию на него ... но я все же думаю, что более вероятно, что что-то происходит с вводом, а не с логикой ранее, в комментарии).

...