草庐IT

RSA公钥加密算法

你好世界wxx 2023-12-12 原文

RSA公钥加密算法

1. 什么是RSA?

  • 计算机中常用的加密技术分为两类:对称加密、非对称加密。

  • RSA属于非对称加密。加密、解密过程使用不同的秘钥,分为公钥、私钥。公钥可以公开,私钥不可以。

  • 对称加密:加密和解密使用相同的的秘钥Key,这个Key需要在网络上传输,不安全,因此需要非对称加密。

2. RSA算法

2.1 生成公钥和私钥

(1)随意选择两个大的素数PQP不等于Q

(2)令 N = P × Q 、 T = ( P − 1 ) × ( Q − 1 ) N = P \times Q、T = (P - 1) \times (Q - 1) N=P×QT=(P1)×(Q1)

(3)选择一个整数E作为秘钥,需要满足:gcd(E, T)=1 && E<T

(4)根据 ( D × E )   m o d   T = 1 (D \times E) \ mod \ T = 1 (D×E) mod T=1,计算出D,作为另一个秘钥;

(5)使用PK=(N、E)作为公钥、SK=(N, D)作为私钥(当然可以反过来)。

2.2 使用公钥加密信息

  • 使用PK=(N、E)公钥加密信息。

  • 若明文为M,则密文C可以按照如下计算得到(要求M<N):

C = M E   m o d   N C = M ^ E \ mod \ N C=ME mod N

2.3 使用私钥解密信息

  • 使用SK=(N, D)私钥解密信息。

  • 如密文为C,则明文M可以按照如下计算得到:

M = C D   m o d   N M = C ^ D \ mod \ N M=CD mod N

3. 一个例子

生成公钥和私钥

  • P=11、Q=13

  • N = P × Q = 11 × 13 = 143 、 T = ( P − 1 ) × ( Q − 1 ) = 10 × 12 = 120 N = P\times Q=11\times 13=143、T = (P-1)\times (Q-1)=10\times 12=120 N=P×Q=11×13=143T=(P1)×(Q1)=10×12=120

  • E=7

  • 因为 ( D × 7 )   m o d   120 = 1 (D \times 7) \ mod \ 120 = 1 (D×7) mod 120=1,得到D=103

  • 因此公钥(N, E) = (143, 7),秘钥(N, D)=(143, 103)

使用公钥加密信息

  • 对数据M = 2进行加密,得到加密后的数据C

C = M E   m o d   N = 2 7   m o d   143 = 128 C = M ^ E \ mod \ N \\ = 2^7 \ mod \ 143 = 128 C=ME mod N=27 mod 143=128

使用私钥解密

  • 对数据C=128进行解密,解密后的数据为M

M = C D   m o d   N = 12 8 103   m o d   143 = 2 M = C ^ D \ mod \ N \\ = 128^{103} \ mod \ 143 = 2 M=CD mod N=128103 mod 143=2

4. RSA的应用:数字签名

  • 数字签名是实现安全交易的核心技术之一,实现基础是RSA加密技术。

  • 数字签名类似于我们生活中的手写签名,必须保证签名的人事后不能抵赖,同时不能让别人伪造我们的签名。因此数字签名需要保证:

    • (1)发送者事后不能抵赖对报文的签名;

    • (2)接受者不能伪造对报文的签名。


  • 如果AB发送报文MA手中有私钥,公钥是公开的,AM使用私钥进行加密再发给B即可。

  • 这样即可保证上述两点:

    • (1)因为只有A可以对M使用私钥进行加密,A不能抵赖;

    • (2)B用公钥可以得到原始信息M,如果伪造成M',则A可以证明其伪造了信息。

5. RSA的安全性

  • RSA算法的安全性依赖于大数分解。因此为了保证安全性,需要使得P、Q非常大。

  • 因为数据很大,又牵涉到幂次运算,因此计算量很大。

6. 代码实现

/* 测试用例
11 13
*/
#include <iostream>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

int p, q;  // 两个质数
int N, T;
int E, D;  // 公钥: (N, E), 私钥: (N, D)

PII PK, SK;  // 公钥、私钥

int gcd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}

void gen_keys() {  // 生成公钥、私钥
    
    N = p * q, T = (p - 1) * (q - 1);
    
    for (E = 2; ; E++)
        if (gcd(E, T) == 1)
            break;
    for (D = 2; ; D++)
        if (D * E % T == 1)
            break;
    
    PK = {N, E}, SK = {N, D};
}

int qmi(int a, int b, int p) {
    
    int res = 1 % p;
    while (b) {
        if (b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}

int encryption(int m) {  // 加密
    
    int n = PK.x, e = PK.y;
    return qmi(m, e, n);
}

int decrypt(int c) {  // 解密
    
    int n = SK.x, d = SK.y;
    return qmi(c, d, n);
}

int main() {
    
    cin >> p >> q;
    
    // 第一步:生成公钥、私钥
    gen_keys();
    printf("公钥: (%d, %d)\n", PK.x, PK.y);
    printf("私钥: (%d, %d)\n", SK.x, SK.y);
    
    // 第二步:加密
    int m = 2;
    int c = encryption(m);
    printf("%d 加密后的数据: %d\n", m, c);
    
    // 第三步:解密
    printf("%d 解密后的数据: %d\n", c, decrypt(c));
    
    return 0;
}
  • 参考书:程序员的数学思维修炼。

有关RSA公钥加密算法的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  3. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

    我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

  4. ruby - 如何使用私钥加密完全加密 Ruby 中的数据? - 2

    首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其

  5. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  6. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  7. ruby - 如何在Elixir中使用AES CBC 128进行加密和解密 - 2

    我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(

  8. ruby - 在 Ruby 中实现 Luhn 算法 - 2

    我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s

  9. Ruby 斐波那契算法 - 2

    下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen

  10. ruby-on-rails - Rails add_index 算法 : :concurrently still causes database lock up during migration - 2

    为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti

随机推荐