|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 傻眼貓咪 于 2022-2-10 18:43 编辑
RSA
加密算法 Cryptosystem
RSA 加密演算法是一种非对称加密演算法,在公开金钥加密和电子商业中被广泛使用。 RSA 是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在 1977 年一起提出的。RSA 就是他们三人姓氏开头字母拼在一起组成的。
以下是我的 C++ 代码,只懂皮毛,大佬们见笑了。今后可能还会增加 Java、C 或 Python 代码,共同学习和交流
因为 RSA 涉及的数学公式,其数字长度太大,故用 T 替代类型,方便作修改:- #include <iostream>
- #include <cmath>
- #include <iomanip>
- #define T long long
- using namespace std;
- T gcd(T a, T b) {
- if (!a) return b;
- return gcd(b % a, a);
- }
- auto lcm = [](T a, T b)->T { return (a / gcd(a, b) * b); };
- /* ----- RSA Cryptosystem ----- */
- class RSA {
- private:
- T
- m_p, m_q, // p、q 为质数
- m_N, // N 为明文最长长度
- m_L, // L 为 p-1、q-1 的最小公倍数
- m_D; // D 为解密 Decryption 的乘积次方
- void eKey(); // 赋值 E
- void dKey(); // 赋值 D
- pair<T, T>decryptionKey; // 解密密钥 (D, N)
- public:
- T
- m_E, // E 为加密 Encryption 的乘积次方
- C(T), // 函数:加密
- C(T, pair<T, T>), // 函数:加密
- M(T), // 函数:解密
- M(T, pair<T, T>); // 函数:解密
- pair<T, T>encryptionKey; // 加密密钥 (E, N)
- RSA(); // 构造函数
- RSA(T, T); // 构造函数
- };
- void RSA::eKey() {
- for (T E = 2; E < m_L; E++)
- if (gcd(E, m_L) == 1) {
- m_E = E;
- break;
- }
- }
- void RSA::dKey() {
- for (T D = 2; D < m_L; D++)
- if ((m_E * D) % m_L == 1) {
- m_D = D;
- }
- }
- RSA::RSA() : m_p(17), m_q(19) { // 默认 p、q 值
- m_N = m_p * m_q;
- m_L = lcm(m_p - 1, m_q - 1);
- eKey();
- dKey();
- encryptionKey = make_pair(m_E, m_N); // 加密密钥 (E, N)
- decryptionKey = make_pair(m_D, m_N); // 解密密钥 (D, N)
- }
- RSA::RSA(T x, T y) : m_p(x), m_q(y) {
- m_N = m_p * m_q;
- m_L = lcm(m_p - 1, m_q - 1);
- eKey();
- dKey();
- encryptionKey = make_pair(m_E, m_N); // 加密密钥 (E, N)
- decryptionKey = make_pair(m_D, m_N); // 解密密钥 (D, N)
- }
- // M = C^D mod N (M 为明文)
- // C = M^E mod N (C 为密文)
- T RSA::C(T m) {
- T
- E = m_E,
- N = m_N,
- res = 1;
- while (E--) {
- res *= m;
- res %= N;
- }
- return res;
- }
- T RSA::M(T c) {
- T
- D = m_D,
- N = m_N,
- res = 1;
- while (D--) {
- res *= c;
- res %= N;
- }
- return res;
- }
- /* ----- 假如有密钥 ----- */
- T RSA::C(T m, pair<T, T>Key) {
- T
- E = Key.first,
- N = Key.second,
- res = 1;
- while (E--) {
- res *= m;
- res %= N;
- }
- return res;
- }
- /* ----- 假如有密钥 ----- */
- T RSA::M(T c, pair<T, T>Key) {
- T
- D = Key.first,
- N = Key.second,
- res = 1;
- while (D--) {
- res *= c;
- res %= N;
- }
- return res;
- }
- int main() {
- // 例子:RSA 加密算法
- RSA Cryptosystem(127, 1373); // p = 127、q = 1373,初始 p、q 值 (条件:两者都是质数)
- T A = 162530; // 明文:长度不可超于 p*q(N)
- T B = 65; // 密文
- // 对明文加密 Encryption
- T X = Cryptosystem.C(A);
- // 打印...
- cout
- << "明文:"
- << setfill(' ') << setw(6)
- << A
- << " -> 密文:"
- << setfill(' ') << setw(6)
- << X
- << endl;
- // 对密文解密 Decryption
- T Y = Cryptosystem.M(B);
- // 打印...
- cout
- << "密文:"
- << setfill(' ') << setw(6)
- << B
- << " -> 明文:"
- << setfill(' ') << setw(6)
- << Y
- << endl;
- // 加密密钥 (E, N)
- T a = Cryptosystem.encryptionKey.first;
- T b = Cryptosystem.encryptionKey.second;
- cout
- << "加密密钥:("
- << a
- << ", "
- << b
- << ")"
- << endl;
- return 0;
- }
复制代码 输出结果:- 明文:162530 -> 密文:147881
- 密文: 65 -> 明文:136507
- 加密密钥:(5, 174371)
复制代码 |
|