觅风论坛

标题: 非对称加密RSA C#加密源码 [打印本页]

作者: 小枫嘎嘎    时间: 2024-6-7 16:20
标题: 非对称加密RSA C#加密源码
RSA C#加密源码,不知道写的对不对,请各位指正,只是略微搞懂个原理。还有就是里面肯定有更简洁的方式找公匙私匙,也欢迎大佬补充。
注意:使用RSA加密时密匙必须大于加密内容,否则输出错误信息。



  1. using System;
  2. using System.Collections.Generic;
  3. using System.Numerics;
  4. using System.Security.Cryptography;

  5. public class HelloWorld
  6. {
  7.     public static void Main(string[] args)
  8.     {
  9.         Console.WriteLine("STARTED");
  10.         for (int i = 0; i < 1; i++)
  11.         {
  12.             var primes = GenerateLargePrimes(4096);
  13.             CalcKey(primes.Item1, primes.Item2);
  14.         }
  15.     }

  16.     private static (BigInteger, BigInteger) GenerateLargePrimes(int bitLength)
  17.     {
  18.         BigInteger firstPrime = _GenerateLargePrime(bitLength);
  19.         BigInteger secondPrime = _GenerateLargePrime(bitLength);
  20.         return (firstPrime, secondPrime);
  21.     }

  22.     private static BigInteger _GenerateLargePrime(int bitLength)
  23.     {
  24.         using (var rng = new RNGCryptoServiceProvider())
  25.         {
  26.             BigInteger prime;
  27.             byte[] bytes = new byte[bitLength / 8];
  28.             do
  29.             {
  30.                 rng.GetBytes(bytes);
  31.                 prime = new BigInteger(bytes);
  32.                 prime = BigInteger.Abs(prime);
  33.                 prime |= BigInteger.One; // 确保是奇数
  34.             } while (!IsProbablyPrime(prime, 10)); // 使用 Miller-Rabin 测试

  35.             return prime;
  36.         }
  37.     }

  38.     private static bool IsProbablyPrime(BigInteger source, int certainty)
  39.     {
  40.         if (source == 2 || source == 3)
  41.             return true;
  42.         if (source < 2 || source % 2 == 0)
  43.             return false;

  44.         BigInteger d = source - 1;
  45.         int s = 0;

  46.         while (d % 2 == 0)
  47.         {
  48.             d /= 2;
  49.             s += 1;
  50.         }

  51.         for (int i = 0; i < certainty; i++)
  52.         {
  53.             BigInteger a = RandomIntegerBelow(source - 2) + 1;
  54.             BigInteger temp = d;
  55.             BigInteger mod = BigInteger.ModPow(a, temp, source);
  56.             if (mod == 1 || mod == source - 1)
  57.                 continue;

  58.             for (int j = 0; j < s - 1; j++)
  59.             {
  60.                 mod = BigInteger.ModPow(mod, 2, source);
  61.                 if (mod == 1)
  62.                     return false;
  63.                 if (mod == source - 1)
  64.                     break;
  65.             }

  66.             if (mod != source - 1)
  67.                 return false;
  68.         }

  69.         return true;
  70.     }

  71.     private static BigInteger RandomIntegerBelow(BigInteger n)
  72.     {
  73.         using (var rng = new RNGCryptoServiceProvider())
  74.         {
  75.             byte[] bytes = n.ToByteArray();
  76.             BigInteger r;

  77.             do
  78.             {
  79.                 rng.GetBytes(bytes);
  80.                 r = new BigInteger(bytes);
  81.             } while (r >= n || r <= 0);

  82.             return r;
  83.         }
  84.     }

  85.     public static void CalcKey(BigInteger p, BigInteger q)
  86.     {
  87.         BigInteger n = p * q;
  88.         BigInteger phi = (p - 1) * (q - 1);

  89.         BigInteger e = FindCoprime(phi);
  90.         BigInteger d = ModInverse(e, phi);

  91.         Console.WriteLine("Public key (e, n): (" + e + ", " + n + ")");
  92.         Console.WriteLine("Private key (d, n): (" + d + ", " + n + ")");

  93.         BigInteger message = BigInteger.Parse("9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999");
  94.         BigInteger encrypted = Encrypt(message, e, n);

  95.         Console.WriteLine("Encrypted: " + encrypted);

  96.         BigInteger decrypted = Decrypt(encrypted, d, n);
  97.         Console.WriteLine("Decrypted: " + decrypted);
  98.     }

  99.     public static BigInteger GCD(BigInteger a, BigInteger b)
  100.     {
  101.         if (b == 0)
  102.             return a;
  103.         return GCD(b, a % b);
  104.     }

  105.     public static BigInteger FindCoprime(BigInteger r)
  106.     {
  107.         BigInteger e = 2;
  108.         while (e < r)
  109.         {
  110.             if (GCD(e, r) == 1)
  111.                 return e;
  112.             e++;
  113.         }
  114.         return 1;
  115.     }

  116.     public static BigInteger ModInverse(BigInteger e, BigInteger r)
  117.     {
  118.         BigInteger x, y;
  119.         BigInteger gcd = ExtendedGCD(e, r, out x, out y);
  120.         if (gcd != 1)
  121.         {
  122.             throw new Exception("Inverse doesn't exist.");
  123.         }
  124.         else
  125.         {
  126.             return (x % r + r) % r;
  127.         }
  128.     }

  129.     public static BigInteger ExtendedGCD(BigInteger a, BigInteger b, out BigInteger x, out BigInteger y)
  130.     {
  131.         if (a == 0)
  132.         {
  133.             x = 0;
  134.             y = 1;
  135.             return b;
  136.         }
  137.         BigInteger x1, y1;
  138.         BigInteger gcd = ExtendedGCD(b % a, a, out x1, out y1);
  139.         x = y1 - (b / a) * x1;
  140.         y = x1;
  141.         return gcd;
  142.     }

  143.     public static BigInteger Encrypt(BigInteger m, BigInteger e, BigInteger N)
  144.     {
  145.         return BigInteger.ModPow(m, e, N);
  146.     }

  147.     public static BigInteger Decrypt(BigInteger c, BigInteger d, BigInteger N)
  148.     {
  149.         return BigInteger.ModPow(c, d, N);
  150.     }
  151. }
复制代码




作者: 老子    时间: 2024-6-8 08:22
我知道错了,感谢大神分享
作者: 咬牙坚持    时间: 2024-6-9 00:24
66666666666666666666
作者: 2549051527    时间: 2024-6-9 16:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: gwm231    时间: 2024-6-10 08:29
不错不错 支持下
作者: 孤独    时间: 2024-6-11 00:31
非常不错,感谢分享!
作者: 2098817979    时间: 2024-6-11 14:57
9999999999999999
作者: 好吧你又赢了    时间: 2024-6-12 05:23
人设人阿松大
作者: 汨黎    时间: 2024-6-12 19:49
谢谢分享,下载测试
作者: 舞步    时间: 2024-6-13 10:15
支持,赞
作者: 360403967    时间: 2024-6-14 00:41
碉堡了!
作者: qqq00123    时间: 2024-6-14 12:23
6666666666
作者: sxy19931021    时间: 2024-6-15 00:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 舞步    时间: 2024-6-15 11:46
感谢这个i资源
作者: asd3186789    时间: 2024-6-15 23:27
不错不错 支持下
作者: 舞步    时间: 2024-6-16 11:09
很不错的哦,支持,加油
作者: 张庆伟23    时间: 2024-6-16 14:29
还不错觅风论坛欢迎你
作者: 林哥    时间: 2024-6-16 17:49
好好好好的我要下载看看看
作者: 张庆伟23    时间: 2024-6-16 21:10
我今天才找到这个论坛,非常高兴,加入到觅风老师的论坛
作者: shjia24    时间: 2024-6-17 00:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: 好萌哦    时间: 2024-6-17 03:50
好像还不错!
作者: 1225061801    时间: 2024-6-17 06:42
还不错觅风论坛欢迎你
作者: sxy19931021    时间: 2024-6-17 09:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 哦美国    时间: 2024-6-17 12:25
11111111111111111111111111
作者: 刘小凯    时间: 2024-6-17 15:17
666学习了!!
作者: 汨黎    时间: 2024-6-17 18:08
抢楼了,前排第一次啊
作者: 13778890079    时间: 2024-6-17 22:44
谢谢楼主,,,收藏ing
作者: 1811581892    时间: 2024-6-18 03:19
支持!!!!!!
作者: 萨拉空军司令的    时间: 2024-6-18 07:55
学习一下!十分感谢
作者: 咬牙坚持    时间: 2024-6-18 12:31
路过还不错
作者: 萨拉空军司令的    时间: 2024-6-18 17:06
抢楼了,前排第一次啊
作者: 123456    时间: 2024-6-19 08:29
多上传一点源码
作者: 啦啦啦啦啦啦    时间: 2024-6-19 23:52
感谢感谢分享
作者: 微风    时间: 2024-6-20 15:15
看看,到底好不好,想学学看看
作者: asd3186789    时间: 2024-6-21 06:38
这就是传说中的好资源吗?赶紧看看去!
作者: 养猪大户    时间: 2024-6-21 22:01
支持,赞
作者: 萨拉空军司令的    时间: 2024-6-22 01:11
看看,到底好不好,想学学看看
作者: 张庆伟23    时间: 2024-6-22 04:21
这就是传说中的好资源吗?赶紧看看去!
作者: 1354541    时间: 2024-6-22 07:31
谢谢楼主,,,收藏ing
作者: 565562216    时间: 2024-6-22 10:41
不错哦  喜欢 嘿嘿
作者: a1031399528a    时间: 2024-6-22 13:52
非常不错,感谢分享!
作者: wang798403789    时间: 2024-6-22 16:04
感谢感谢分享
作者: 天汇    时间: 2024-6-22 18:17
我知道错了,感谢大神分享
作者: 天汇    时间: 2024-6-22 20:30
666学习了!!
作者: 天汇    时间: 2024-6-22 22:42
学习了!!!!
作者: lijianan12300    时间: 2024-6-23 00:55
支持!!!!!!
作者: SDS    时间: 2024-6-23 13:58
我要下载试试,我要下载试试...
作者: a32d321as    时间: 2024-6-24 03:01
谢谢大人的分享
作者: hui861140    时间: 2024-6-24 16:04
不错不错 支持下
作者: wang798403789    时间: 2024-6-25 05:07
路过还不错
作者: 风月    时间: 2024-6-25 18:09
支持!!!!前排!!!!
作者: 图个简单    时间: 2024-6-26 08:25
666666666666666666666666
作者: 汨黎    时间: 2024-6-26 22:41
感谢这个i资源
作者: 好萌哦    时间: 2024-6-27 12:57
学习下  学习下  学习下
作者: 我爱你苏根    时间: 2024-6-28 03:12
谢谢分享!~
作者: 小粑    时间: 2024-6-28 17:28
看帖子的要发表下看法




欢迎光临 觅风论坛 (https://www.eyyba.com/) Powered by Discuz! X3.4