试图理解 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));
}
的代码
程序的输出也是这样的
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 密钥。
优化的实现在您的实现不使用的私钥中有其他中间值。
我试图理解这段代码,但我无法理解它。 所以程序正在接受一个值并使用 "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));
}
的代码
程序的输出也是这样的
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 密钥。
优化的实现在您的实现不使用的私钥中有其他中间值。