导读
易语言5.6完美版,可静态编译,绿色无后门

学习易语言 讲究的是系统,如果你正在四处闲逛,你懂的永远是皮毛! 觅风论坛正在为每个困惑的对易语言 详细

[c#] 非对称加密RSA C#加密源码

[复制链接]

微信扫一扫 分享朋友圈

小枫嘎嘎 发表于 2024-6-7 16:20:33 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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. }
复制代码



回复

使用道具 举报

精彩评论55

老子 发表于 2024-6-8 08:22:46 | 显示全部楼层
我知道错了,感谢大神分享
回复 支持 反对

使用道具 举报

咬牙坚持 发表于 2024-6-9 00:24:59 | 显示全部楼层
66666666666666666666
回复 支持 反对

使用道具 举报

2549051527 发表于 2024-6-9 16:27:12 | 显示全部楼层
想学唉,可惜现在的我啥都不会
回复 支持 反对

使用道具 举报

gwm231 发表于 2024-6-10 08:29:25 | 显示全部楼层
不错不错 支持下
回复 支持 反对

使用道具 举报

孤独 发表于 2024-6-11 00:31:37 | 显示全部楼层
非常不错,感谢分享!
回复 支持 反对

使用道具 举报

2098817979 发表于 2024-6-11 14:57:40 | 显示全部楼层
9999999999999999
回复 支持 反对

使用道具 举报

好吧你又赢了 发表于 2024-6-12 05:23:43 | 显示全部楼层
人设人阿松大
回复 支持 反对

使用道具 举报

汨黎 发表于 2024-6-12 19:49:45 | 显示全部楼层
谢谢分享,下载测试
回复 支持 反对

使用道具 举报

舞步 发表于 2024-6-13 10:15:48 | 显示全部楼层
支持,赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注我们:觅风论坛与你快乐分享

收藏本站

用心服务做个非盈利公益编程网站

www.eyyba.com

服务人:觅风论坛

Email:eyyba@foxmail.com

Powered by WWW.EYYBA.COM X3.4© 2001-2023 Inc.   版权所有   

觅风论坛  疆ICP备15020893号-1