|

楼主 |
发表于 2022-5-26 15:39:37
|
显示全部楼层
本帖最后由 张欢 于 2022-5-26 15:43 编辑
大数版本的RSA
(之前重新写的不使用BigInteger的大数版本的RSA算法实现,忘记上传了)
一.RSA算法简介
RSA公开密钥密码体制是一种使用不同的加密秘钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体质。它通常是先生成一对RSA密钥,其中之一是保密密钥,有用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。
二.RSA算法实现步骤
三.大数版本RSA算法代码
- package rsa;
- import java.util.Random;
- import java.util.Scanner;
- import java.math.BigInteger;
- import java.security.SecureRandom;
- public class Rsa1 {
- private static final int ORDER = 100000;// 随机数的数量级
- private static final int MIN = 10000; // 选择的随机数的最小值
- public static long getPrime() { // 获取一个随机数,判断是否为素数,并用MillerRabin方法检验
- long x = 0;
- while (x % 2 == 0 || !MillerRabin(x, 5)) {
- x = getRandom();
- }
- return x;
- }
- public static long getRandom() {// 随机生成一个奇数
- long x = 3;
- Random rd = new Random();
- do {
- x = rd.nextInt(ORDER);
- } while (x < MIN || x % 2 == 0);
- return x;
- }
- public static boolean MillerRabin(long n, int t) {
- for (int i = 0; i < t; i++)
- if (!isPrime(n))
- return false;
- return true;
- }
- public static boolean isPrime(long n) {
- long k, q;
- SecureRandom random = new SecureRandom();
- for (k = 0; (((n - 1) >> k) & 1) == 0; k++)
- ;
- q = (n - 1) >> k;
- long a = random.nextLong(n);
- if (squareMultiply(a, q, n) == 1)
- return true;
- for (int j = 0; j < k; j++)
- if (squareMultiply(a, (int) Math.pow(2, j) * q, n) == n - 1)
- return true;
- return false;
- }
- public static long squareMultiply(long a, long b, long p) {
- long x = 1, y = a;
- long len = (long) Math.ceil((Math.log(b) / Math.log(2)));
- for (int i = 0; i < len; i++) {
- if (((b >> i) & 1) == 1) {
- x = (x * y) % p;
- }
- y = (y * y) % p;
- }
- return x;
- }
- public static long powMod(long x, long y, long z) {//模幂运算
- if (y == 0)
- return 1 % z;
- long half = powMod(x, y >> 1, z);
- half = (half * half) % z;
- if ((y & 1) == 0) { // y是偶数
- return half;
- } else { // y是奇数
- return (half * (x % z)) % z;
- }
- }
- public static long Inverse(long a, long b) { // 模逆运算
- long[] m = { 1, 0, a };
- long[] n = { 0, 1, b };
- long[] temp = new long[3];
- long q = 0; // 初始化
- boolean flag = true;
- while (flag) {
- q = m[2] / n[2];
- for (int i = 0; i < 3; i++) {
- temp[i] = m[i] - q * n[i];
- m[i] = n[i];
- n[i] = temp[i];
- }
- if (n[2] == 1) {
- if (n[1] < 0) {
- n[1] = n[1] + a;
- }
- return n[1];
- }
- if (n[2] == 0) {
- flag = false;
- }
- }
- return 0;
- }
- public static void main(String[] args) {
- long p = getPrime(); // 生成两个素数
- long q = getPrime();
- while (p == q) {
- q = getPrime();
- }
- long n = p * q;
- long φ = (p - 1) * (q - 1);
- long e = getPrime();
- long d = Inverse(φ, e);
- System.out.println("p:"+p);
- System.out.println("q:"+q);
- System.out.println("n:"+n);
- System.out.println("φ:"+φ);
- System.out.println("e:"+e);
- System.out.println("d:"+d);
- System.out.print("请输入明文:");
- Scanner sc = new Scanner(System.in);
- long m=sc.nextLong();
- long c=powMod(m, e, n);
- System.out.println("密文:" + c);
- m = powMod(c, d, n);
- System.out.println("解密得到明文:" + m);
- sc.close();
- }
- }
复制代码 四、运行结果
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|