2013-10-27 5 views
4

Я делаю простую программу для шифрования/дешифрования с использованием RSA-алгоритма в Java. Я создаю объект шифра следующим образом:RSA Encryption/Decryption using Java

//Create a Cipher object 
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding"); 

я шифрование с помощью вызова функции шифровать:

String cipher=encrypt(textByte, pair, rsaCipher); 
System.out.println("The Encryption using RSA Algorithm : "+cipher); 

И расшифровку как:

//Decryption 
String plain=decrypt(Base64.decodeBase64(cipher),pair, rsaCipher); 
System.out.println("The Decryption using RSA Algorithm : "+plain); 

Когда я показываю вывод, выход дешифрования возвращает длинное пространство перед исходным текстом: enter image description here

Однако, когда я редактирую код для создания объекта Cipher: // Создаем объект Cipher Cipher rsaCipher = Cipher.getInstance ("RSA");

т.е., удалены аргументы режима работы и отступов, проблема разрешится и выход становится: enter image description here

Где проблема. В первом случае (когда появляется пробел), я указал NoPadding? Почему в расшифрованном сообщении появляются пробелы? Даже если я использовал прокладку, я ожидаю, что этого не произойдет.

EDIT: Это шифровать и дешифровать методы:

public static String encrypt(byte[] textBytes, KeyPair pair, Cipher rsaCipher) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException 
{ 
    //get the public key 
    PublicKey pk=pair.getPublic(); 


    //Initialize the cipher for encryption. Use the public key. 
    rsaCipher.init(Cipher.ENCRYPT_MODE, pk); 

    //Perform the encryption using doFinal 
    byte[] encByte = rsaCipher.doFinal(textBytes); 

    // converts to base64 for easier display. 
    byte[] base64Cipher = Base64.encodeBase64(encByte); 

    return new String(base64Cipher); 
}//end encrypt 

public static String decrypt(byte[] cipherBytes, KeyPair pair, Cipher rsaCipher) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException 
{ 
    //get the public key 
    PrivateKey pvk=pair.getPrivate(); 

    //Create a Cipher object 
    //Cipher rsaCipher = Cipher.getInstance("RSA/ECB/NoPadding"); 

    //Initialize the cipher for encryption. Use the public key. 
    rsaCipher.init(Cipher.DECRYPT_MODE, pvk); 

    //Perform the encryption using doFinal 
    byte[] decByte = rsaCipher.doFinal(cipherBytes); 

    return new String(decByte); 

}//end decrypt 
+0

Можете ли вы показать нам свои методы 'encrypt' и' decrypt'? – Craigy

ответ

5

Ваша проблема заключается в том, действительно с прокладкой. Для безопасной работы RSA требуется некоторая прокладка, либо PKCS # 1 1.5, либо дополнение OAEP на практике. Кроме того, требуется найти начало и конец зашифрованного открытого текста.

Модульное возведение в степень RSA выполняется с использованием больших целых чисел. Результаты этих операций затем представляются в виде октетных строк. Эти строки октетов в основном представляют собой большие конечные, неподписанные, фиксированные длины представления целого числа. Эти целые числа остаются заполненными байтами 00 (это называется примитивом I2OS в стандарте RSA). Итак, что вы видите, это результат модульного возведения в степень, с дополнением 00.

Короче говоря, всегда используйте схему прокладки. В настоящее время OAEP будет предпочтительнее. Используйте его вместе с гибридной схемой шифрования или используйте формат контейнера более высокого уровня, такой как CMS или PGP.

0

Модульное возведение в степень RSA выполняется с использованием больших целых чисел. Результаты этих операций затем представляются в виде октетных строк. Эти строки октетов в основном представляют собой большие конечные, неподписанные, фиксированные длины представления целого числа. Эти целые числа оставляются заполненными 00 значными байтами (это называется примитивом I2OS в стандарте RSA). Итак, что вы видите, это результат модульного возведения в степень, с заполнением 00 все еще на месте.

-2

Надеюсь, что это поможет! :)

import java.util.*; 
import java.math.*; 
class RSA 
{ 
public static void main(String args[]) 
{ 
BigInteger one, p, q, E, D, n,P,Q; 
Scanner s = new Scanner(System.in); 
Scanner t = new Scanner(System.in); 
System.out.println("Enter A's prime number!"); 
p = s.nextBigInteger(); 
System.out.println("Enter B's prime number!"); 
q = s.nextBigInteger(); 
n = p.multiply(q); 
P = p.subtract(BigInteger.ONE); 
Q = q.subtract(BigInteger.ONE); 
int x = 0; 
do 
{ 
System.out.println("Enter Public key "); 
E =s.nextBigInteger(); 
if(((P.gcd(E)).equals(BigInteger.ONE))&&((Q.gcd(E)).equals(BigInteger.ONE))) 
{x++;} 
}while(x==0); 
for(int i = 1;;i++) 
{ 
D=new BigInteger(String.valueOf(i)); 
if(((D.multiply(E)).mod(P.multiply(Q))).equals(BigInteger.ONE)) 
break; 
} 
System.out.println("Enter Plain text!"); 
String in = "", out ="", text = t.nextLine(); 
for(int i = 0;i < text.length();i++){ 
BigInteger T = new BigInteger(String.valueOf((int)(text.charAt(i)))), O, TF; 
O = T.modPow(E,n); 
out += (char)O.intValue(); 
TF = O.modPow(D,n); 
in += (char)TF.intValue(); 
} 
System.out.println("Encrypted text : " + out); 
System.out.println("Decrypted text : "+ in); 
} 
} 
+1

Не могли бы вы объяснить изменения, необходимые для создания этого, чтобы помочь OP с их вопросом? –