如何在不使用外部库的情况下在 JAVA 中生成私有 public 密钥
How to generate private public key in JAVA using no external libraries
我们得到了一项作业,其中一部分要求我们生成 public 私钥对。这些不需要特别安全,因为它只是为了概念的演示。
我们不能使用任何类型的加密库或外部工具。
我将如何生成这些?
编辑:在这里找到了对 RSA 的很好的解释:https://www.educative.io/edpresso/what-is-the-rsa-algorithm
我使用 JShell 来演示基本的 public-仅使用 Java 的 BigInteger
:
生成私钥
jshell> import java.math.BigInteger;
jshell> var rnd = new java.security.SecureRandom();
rnd ==> Hash_DRBG,SHA-256,128,reseed_only
首先我们需要2个素数
jshell> var p1 = BigInteger.probablePrime(512, rnd);
p1 ==> 1176110601168217581401499298469596353224364190716 ... 72507270343325790065694831
jshell> var p2 = BigInteger.probablePrime(512, rnd);
p2 ==> 1001341560055006431459083188828513502474297271020 ... 34378293673605844490263567
接下来我们计算public键。 0x10001 是 public 键的常用指数。
jshell> var n = p1.multiply(p2);
n ==> 1177688424171014462551464978852125044384293220079 ... 24824881562893076179522177
jshell> var e = BigInteger.valueOf(0x10001);
e ==> 65537
public键是e
和n
。
现在是隐私部分。
jshell> var phi = p1.subtract(BigInteger.ONE).multiply(p2.subtract(BigInteger.ONE));
phi ==> 1177688424171014462551464978852125044384293220079 ... 17939317545961441623563780
jshell> var d = e.modInverse(phi);
d ==> 7023685818262702180949167670691999860354377649273 ... 38390163809778429090416313
私钥现在是 d
和 n
。
让我们测试一下:
jshell> var secret = BigInteger.valueOf(1337);
secret ==> 1337
jshell> var enc = secret.modPow(e, n);
enc ==> 1059982071031392497566614763259148320406936402012 ... 39171914529632475117049800
jshell> enc.modPow(d, n);
==> 1337
我们可以通过网络发送 enc
,没有人可以在不知道私钥的情况下解密它。好吧,至少在理论上是这样。实际上,您应该填充消息。
我们得到了一项作业,其中一部分要求我们生成 public 私钥对。这些不需要特别安全,因为它只是为了概念的演示。
我们不能使用任何类型的加密库或外部工具。
我将如何生成这些?
编辑:在这里找到了对 RSA 的很好的解释:https://www.educative.io/edpresso/what-is-the-rsa-algorithm
我使用 JShell 来演示基本的 public-仅使用 Java 的 BigInteger
:
jshell> import java.math.BigInteger;
jshell> var rnd = new java.security.SecureRandom();
rnd ==> Hash_DRBG,SHA-256,128,reseed_only
首先我们需要2个素数
jshell> var p1 = BigInteger.probablePrime(512, rnd);
p1 ==> 1176110601168217581401499298469596353224364190716 ... 72507270343325790065694831
jshell> var p2 = BigInteger.probablePrime(512, rnd);
p2 ==> 1001341560055006431459083188828513502474297271020 ... 34378293673605844490263567
接下来我们计算public键。 0x10001 是 public 键的常用指数。
jshell> var n = p1.multiply(p2);
n ==> 1177688424171014462551464978852125044384293220079 ... 24824881562893076179522177
jshell> var e = BigInteger.valueOf(0x10001);
e ==> 65537
public键是e
和n
。
现在是隐私部分。
jshell> var phi = p1.subtract(BigInteger.ONE).multiply(p2.subtract(BigInteger.ONE));
phi ==> 1177688424171014462551464978852125044384293220079 ... 17939317545961441623563780
jshell> var d = e.modInverse(phi);
d ==> 7023685818262702180949167670691999860354377649273 ... 38390163809778429090416313
私钥现在是 d
和 n
。
让我们测试一下:
jshell> var secret = BigInteger.valueOf(1337);
secret ==> 1337
jshell> var enc = secret.modPow(e, n);
enc ==> 1059982071031392497566614763259148320406936402012 ... 39171914529632475117049800
jshell> enc.modPow(d, n);
==> 1337
我们可以通过网络发送 enc
,没有人可以在不知道私钥的情况下解密它。好吧,至少在理论上是这样。实际上,您应该填充消息。