我正在尝试理解这段代码,但我无法理解这一点。 因此程序接受一个值并使用“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
是公钥还是私钥中的任何一个?
答案 0 :(得分:2)
程序是否将输入的值转换为字节然后加密字节?
是的,通常对二进制数据执行加密。另一方面,RSA原语在大整数上使用模运算。您展示的RSA
在内部使用BigInteger
,它提供constructor BigInteger(byte[] val)
来创建字节数组中的大整数。
还有另一个constructor BigInteger(String val)
接受一个字符串,但是假设字符串只包含要用基数10表示法加密的数字,而不是任意数据。
是公钥还是私钥中的任何一个?
不,这些值都不是公钥或私钥的表示。密钥对隐藏在RSA rsa = new RSA();
后面。
公钥由模数N
和公共指数e
组成。私钥由模数N
和私有指数d
组成。私钥通常还包含公共指针,以便可以从私钥创建公钥。
优化的实现在私钥中有其他中间值,您的实现不会使用。