试图理解 RSA 加密代码示例

Trying to understand RSA encryption code example

我试图理解这段代码,但我无法理解它。 所以程序正在接受一个值并使用 "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

是 public 密钥还是私钥?

Is the program converting the inputted values into bytes and then encrypting the bytes?

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

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

Is any of that the public key or the private key?

不,这些值中的 none 表示 public 或私钥。密钥对隐藏在 RSA rsa = new RSA();.

后面

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

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