试图了解RSA加密代码示例

时间:2015-03-15 11:25:46

标签: java encryption cryptography rsa

我正在尝试理解这段代码,但我无法理解这一点。 因此程序接受一个值并使用“RSA”算法对输入值进行加密。

我不明白的是代码的bytesToString部分。程序是否将输入的值转换为字节然后加密字节?

public RSA() {
    r = new Random();
    p = BigInteger.probablePrime(bitlength, r);
    q = BigInteger.probablePrime(bitlength, r);
    N = p.multiply(q);

    phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
    e = BigInteger.probablePrime(bitlength/2, r);

    while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) < 0 ) {
        e.add(BigInteger.ONE);
    }
    d = e.modInverse(phi); 
} 

public static void main (String[] args) throws IOException
    {
    RSA rsa = new RSA();
    DataInputStream in=new DataInputStream(System.in);

    String teststring ;
    System.out.println("Enter the plain text:");
    teststring=in.readLine();
    System.out.println("Encrypting String: " + teststring);
    System.out.println("String in Bytes: " + bytesToString(teststring.getBytes()));

    // encrypt
    byte[] encrypted = rsa.encrypt(teststring.getBytes());
    System.out.println("Encrypted String in Bytes: " + bytesToString(encrypted));


    // decrypt
    byte[] decrypted = rsa.decrypt(encrypted);
    System.out.println("Decrypted String in Bytes: " +  bytesToString(decrypted));

    System.out.println("Decrypted String: " + new String(decrypted));

}

您可以在http://www.coders-hub.com/2013/04/implementation-of-rsa-using-java.html?showComment=1426355678160#c2330533116597007284

查看此处的代码

程序的输出也是这样的

Enter the plain text:
Hello world
Encrypting String: Hello world
String in Bytes: 7210110810811132119111114108100
Encrypted String in Bytes: 0-91-1-63245736-287660-6518-312926-102125-106-899450-8765-100100-126-1810592-123-65-26-104-96-894689-9746-1225763-1-94-43-3498-19-101-45-607227-69-79115-94-43-28-10123-7258-16-413-1854-51-24-11925-100-582056-89121-16-6010512239-1111188570-73-80-591-432-23-94-105-10311672381-76-28-1021-38-51-67-32122-2-10-51-86-15-37-104-5721100-84-444085-126-61-5011554-39-15-18-126-685-48-25-25124-11541-108-1846107112-104-9-56-101-90121582574-18-74-954184-80-6856-97-6797-23202-125-724833-19-26-934637-127-126-327399-834924-116-44-53-13-7526-8041104-4093123102101-95-2462-1684-8841119119-10581-9011178-83-521858-2321-570-107-10-54-708-981076-17-9934103-19-3943-11974-2365-1202630117-107-123-2411-47-624119-78
Decrypted String in Bytes: 7210110810811132119111114108100
Decrypted String: Hello world

是公钥还是私钥中的任何一个?

1 个答案:

答案 0 :(得分:2)

  

程序是否将输入的值转换为字节然后加密字节?

是的,通常对二进制数据执行加密。另一方面,RSA原语在大整数上使用模运算。您展示的RSA在内部使用BigInteger,它提供constructor BigInteger(byte[] val)来创建字节数组中的大整数。

还有另一个constructor BigInteger(String val)接受一个字符串,但是假设字符串只包含要用基数10表示法加密的数字,而不是任意数据。

  

是公钥还是私钥中的任何一个?

不,这些值都不是公钥或私钥的表示。密钥对隐藏在RSA rsa = new RSA();后面。

公钥由模数N和公共指数e组成。私钥由模数N和私有指数d组成。私钥通常还包含公共指针,以便可以从私钥创建公钥。

优化的实现在私钥中有其他中间值,您的实现不会使用。