精华内容
下载资源
问答
  • RSA非对称加密

    2018-05-25 10:10:23
    RSA非对称加密是基于数字证书的加密体系中的一种加密方式。当发送信息时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有...
  • RSA 非对称加密

    2021-04-03 19:38:06
    非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密,私钥解密、私钥加密,公钥解密。 与非对称加密算法相比,对称加解密的效率要高得多。但对称加密的秘钥不好管理,容易...

    1. 两种加密方式

    对称加密

    如:DES,AES,3DES

    对称加密指的就是加密和解密使用同一个秘钥。对称加密只有一个秘钥,作为私钥。


    非对称加密

    如:RSA,ECC

    非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密,私钥解密、私钥加密,公钥解密


    与非对称加密算法相比,对称加解密的效率要高得多。但对称加密的秘钥不好管理,容易泄露,一般两者联合使用。

    C/S 模型

    1. server 计算出一对秘钥 pub/pri。将私钥保密,将公钥公开。
    2. client 请求 server 时,拿到服务端的公钥 pub。
    3. client 通过 AES 计算出一个对称加密的秘钥 key。 然后使用pub将 key 进行加密。
    4. client 将加密后的密文发送给 server 。server 通过pri解密获得 key
    5. 然后两边的通讯内容就通过对称密钥 key 以对称加密算法来加解密。


    2. RSA 加密算法

    由来

    算术基本定理告诉数学家们合数可以写为两个或多个质数的乘积形式,但是没有具体告诉数学家们具体怎么进行合数的质数分解。对于比较小的合数,我们可以尝试用它除以各个正整数,通过看是否能够整除来找到质因子,但将一个大的数分解为两个质数很难。这也是非对称加密算法的灵感来源。

    RSA 算法是由 Rivest、Shamir 与Adleman 三个人提出的(有兴趣的小伙伴可以查阅资料多了解一些):

    RSA 为三个人的名字的首字母组合!


    原理

    首先要知道两条定理:

    1. 对于任意 a<na < n,只有当 n 与 a 互质时,才能找到 e 使得 q×emod  n=1q \times e \mod n = 1
    2. 如果一个合数 n 能够分解为两个质数 p 和 q,那么满足上一个定理的 e 一共有 $\Phi = (p-1)\times(q-1) $ 个

    生成公钥和私钥的步骤如下:

    1. 选择两个大质数 p 和 q,计算 n=p×qn = p \times q
    2. 选取一个与 (p1)×(q1)(p-1)\times(q-1) 互质的数 e,计算满足 d×emod  (p1)(q1)=1d \times e \mod (p-1)(q-1) = 1 的数 d,即 d=e1mod(p1)(q1)d = e^{-1} mod (p-1)(q-1)
    3. 得到公钥:(n,e)(n, e),私钥 (n,d)(n, d)
    4. 对方发消息 m 时通过公钥 (n, e) 加密,密文为 C=memod  nC = m^e \mod n
    5. 我方接收消息后通过私钥 (n, d) 解密,明文 m=Cdmod  n=Cd×emod  n=mm = C^d \mod n = C^{d \times e} \mod n = m

    证明过程可以查阅资料哈~

    RSA 安全吗?

    若存在第三方 eve 截取了消息 C 和公钥 (n, e) 时,信道还安全吗?
    eva 尝试通过公钥 (n, e) 计算私钥 (n, d) …

    1. 要计算 d,首先要知道 (p-1)(q-1)
    2. 要计算 (p-1)(q-1) ,需要利用 n 计算出 p 和 q
    3. Emmm… 要破解消息的话需要进行质数分解,短时间内几乎不可能完成,算了 QAQ

    因此,非对称加密算法实现了在不安全的信道上实现安全的信息传输!

    但也不是绝对安全的,当第三方拦截双方发送的消息后,可以收集两边的公钥,将自己的公钥替换一方的公钥,那信道将会不安全!



    3. 计算 abmod  ca^b \mod c

    看到这里,肯定有人会问,上面的加密解密要算高次幂,数据大了内存会溢出吗?
    有以下两种方法计算:

    method1

    通过循环计算(为了避免溢出,每个循环都进行取模)

    def mod(a, b, c):
        res = 1
        while b > 0:
            b -= 1
            res = (res * a) % c
        return res
    

    这种方法好理解,但计算耗费较长的时间!


    method2

    将 b 分解为二进制,按位计算(证明过程看着复杂实际上很简单):

    Suppose b=(bn1...b2b1b0)2b = (b_{n-1}...b_2b_1b_0)_2

    because (a×b)mod  c=[(amod  c)×(bmod  c)]mod  c(a \times b) \mod c = [(a \mod c) \times (b \mod c)] \mod c

    abmodc=a(bn1...b2b1b0)2mod  c=ab0+b1×21+...+bn1×2n1mod  c=(ab0+b1×21+...+bn2×2n2×abn1×2n1)mod  c=[(An1mod  c)×(abn1×2n1mod  c)]mod  c\begin{aligned} a^b mod c &= a^{(b_{n-1}...b_2b_1b_0)_2} \mod c \\ &= a^{b_0+b_1 \times 2^1+...+b_{n-1} \times 2^{n-1}} \mod c \\ &= (a^{b_0+b_1 \times 2^1+...+b_{n-2} \times 2^{n-2}} \times a^{b_{n-1} \times 2^{n-1}}) \mod c \\ &= [(A_{n-1} \mod c) \times (a^{b_{n-1} \times 2^{n-1}} \mod c)] \mod c \\ \end{aligned}

    where An=ab0+b1×21+...+bn×2nA_{n} = a^{b_0+b_1 \times 2^1+...+b_{n} \times 2^{n}}, Tn=a2nT_{n} = a^{2^{n}} and Tn=Tn12mod  cT_{n} = T^2_{n-1} \mod c


    通过这种方法计算,只需要维护变量 TnT_n 的值,即可通过递推公式快速地算出结果,循环计算的次数为 log2blog_{2} b

    T0=a20=a,A0=ab0An=An1×TnbnTn=(Tn1×Tn1)mod  c \begin{aligned} &T_0 = a^{2^0} = a, A_0 = a^{b_0}\\ &A_n = A_{n-1} \times {T_n}^{b_n}\\ &T_n = (T_{n-1} \times T_{n-1}) \mod c\\ \end{aligned}

    Python 实现的代码如下:

    def mod(a, b, c):
    	# initialize
    	bn = b & 1
    	b = b >> 1
    	Tn = a % c
    	An = a ** bn
    
    	# iteration
    	while b != 0:
    		bn = b & 1
    		b = b >> 1
    		Tn = (Tn * Tn) % c
    		An = (Tn ** bn) * An % c
    	return An
    
    print(mod(216723243213, 2132141232331, 347))	# 34
    

    Amazing !


    REERENCES

    1. 知乎-质数了不起——知乎刘巍然作品
    2. 图解密码技术
    展开全文
  • RSA非对称加密和DES对称加密代码示例包含(commons-lang3-3.1 commons-codec-1.4.jar)
  • RSA非对称加密算法

    2019-02-14 23:12:03
    主要介绍RSA非对称加密算法的由来和应用场景,以及加密原理
  • Rsa非对称加密技术工具类
  • vue使用rsa非对称加密 背景 (Background) Security has been a primary concern in business and government for hundreds of years ago. Government regulation is explicitly mentioned how to handle Customer ...

    vue使用rsa非对称加密

    背景 (Background)

    Security has been a primary concern in business and government for hundreds of years ago. Government regulation is explicitly mentioned how to handle Customer data. And it is essential to protect your business continuity from vulnerability exploit.

    在数百年前,安全一直是企业和政府关注的主要问题。 明确提到了政府法规如何处理客户数据。 而且,保护您的业务连续性不受漏洞利用至关重要。

    目的 (Objective)

    Send data securely to other parties via an HTTP request. Other parties mean a partner entity which doing a communication to us. Secure parameters are:

    通过HTTP请求将数据安全地发送给其他方。 其他各方是指与我们进行沟通的合作伙伴实体。 安全参数为:

    • Data cannot be read by an unauthorized party

      未经授权的一方无法读取数据
    • The data source can be verified from the right party

      数据源可以从正确的一方进行验证

    组件 (Components)

    The service is able to send and receive data. Users will use the service to send data to any party using the same service. Prerequisite information for this setup is each party should have Public Key for each partner.

    该服务能够发送和接收数据。 用户将使用该服务将数据发送给使用同一服务的任何一方。 此设置的先决条件信息是各方对每个合作伙伴都应具有公钥。

    The diagram below shows how Alice transfers data to Bob using a secure service. The service which Alice use needs Bob’s public key to send a message to Bob and Alice’s private key to sign the message. On the other side, Bob running a service that has his private key to read the message from Alice and Alice’s private key to verify her signature.

    下图显示了Alice如何使用安全服务将数据传输到Bob。 爱丽丝使用的服务需要鲍勃的公钥将消息发送到鲍勃,爱丽丝的私钥对消息进行签名。 另一方面,鲍勃运行的服务具有其私钥,该私钥用于从爱丽丝读取消息,而爱丽丝的私钥用于验证她的签名。

    Image for post
    Top-view secure data transfer service
    顶视图安全数据传输服务

    Once top-view is understood, we need to see components inside the service. Keep in note that a single service can communicate with many services as long as it has the partner’s public key.

    了解了顶视图之后,我们需要查看服务中的组件。 请注意,只要一个服务具有伙伴的公钥,它就可以与许多服务进行通信。

    Here is the minimum requirement to build the service.

    这是构建服务的最低要求。

    1. The private key reader

      私钥读取器
    2. The public key reader

      公钥阅读器
    3. Message encryptor

      消息加密器
    4. Signature writer

      签名作家
    5. Message decipher

      讯息解密
    6. Signature verifier

      签名验证者
    7. HTTP listener

      HTTP侦听器
    8. HTTP post

      HTTP发布

    The diagram below shows the interaction between components.

    下图显示了组件之间的交互。

    Image for post
    What's Inside the Service
    服务内容

    (Code)

    The code below is the implementation of the requirement above in Go. The service will be able to communicate with any service even with different code language as long as follow the same requirement.

    以下代码是Go中上述要求的实现。 只要遵循相同的要求,该服务就可以与任何服务通信,即使使用不同的代码语言也是如此。

    Private key reader

    私钥阅读器

    The function will read the private key file in naming format:[name]-private.pem

    该函数将以命名格式读取私钥文件: [name] -private.pem

    There are many tools to generate RSA pair keys. It’s recommended to use a 2048bit size.

    有许多工具可以生成RSA对密钥。 建议使用2048位大小。

    公钥阅读器 (Public key reader)

    The function will read the public key given by the partner in the naming format: [name]-public.pem

    该函数将读取伙伴以以下格式提供的公钥: [名称] -public.pem

    The input parameter is an array of string in the sense of the service will communicate with many parties.

    从服务的意义上说,输入参数是一个字符串数组,它将与许多各方进行通信。

    The output is a map-of-object type with the key is partner name and value is the public key. The map-of-object will be utilized when encrypting data.

    输出为对象映射类型,其键为伙伴名称,值为公钥。 加密数据时将使用对象图。

    消息加密器 (Message encryptor)

    The input of the function is the message. Original data before encryption called plaintext and data after encryption called ciphertext.

    该功能的输入是消息。 加密之前的原始数据称为明文,加密之后的数据称为密文。

    The function uses the minimum required encryption which is plaintext and public key.

    该功能使用最低要求的加密方式,即纯文本和公钥。

    The output is written in base64 string to make it readable to a human.

    输出以base64字符串编写,以使其对人类可读。

    签名作家 (Signature writer)

    The function will use ciphertext from the previous function. Using the private key of Alice (the sender) the output will be a unique signature that can’t be replicated by other parties.

    该功能将使用上一个功能的密文。 使用Alice(发送者)的私钥,输出将是唯一的签名,其他方无法复制。

    签名验证者 (Signature verifier)

    When receiving a message from other parties, the signature verifier function shall be executed first.

    当接收到来自其他方的消息时,签名验证程序功能应首先执行。

    The function will calculate the ciphertext and signature using the partner’s public key. The output is an error object if the signature is not verified.

    该函数将使用伙伴的公共密钥来计算密文和签名。 如果未验证签名,则输出为错误对象。

    解码 (Decipher)

    If the signature is verified, the next thing to do is decipher the ciphertext into plaintext. Only the right private key able to read the message.

    如果签名经过验证,则下一步是将密文解密为纯文本。 只有正确的私钥才能读取消息。

    This is the last step of the flow. We can write out the plaintext in the form of a text display or any kind presentation form.

    这是流程的最后一步。 我们可以以文本显示或任何形式的表示形式写出纯文本。

    HTTP发布 (HTTP post)

    Now, we need to put all the functions together.

    现在,我们需要将所有功能放在一起。

    The input is a gin object which comes from gin — a very popular HTTP routing.

    输入是来自gingin对象-一种非常流行的HTTP路由。

    We will use this function on HTTP routing when the user calls the service to transfer the data. The parameter required is

    当用户调用服务来传输数据时,我们将在HTTP路由上使用此功能。 所需参数为

    • receiver: partner name, this required to get the right public key

      接收方:合作伙伴名称,此名称是获取正确的公共密钥所必需的
    • host: this is the partner service host address that will be hit after encrypt and sign the message

      主机:这是在对消息进行加密和签名后将被击中的伙伴服务主机地址
    • message: the original information to be sent

      消息:要发送的原始信息

    The function will first encrypt the message, sign the ciphertext and transfer the ciphertext to the partner service. The response to the user is HTTP Status to tell the partner service is reachable or not and ciphertext for that sent.

    该功能将首先对消息进行加密,对密文进行签名,然后将密文传输到合作伙伴服务。 对用户的响应是“ HTTP状态”(HTTP Status)以通知伙伴服务是否可访问以及所发送的密文。

    This is the complete flow to send data securely to other parties.

    这是将数据安全地发送给其他方的完整流程。

    HTTP接收器 (HTTP receiver)

    This function is executed when the service receives data from other services. Put all the necessary functions to make the data available to the user. First, it matches the public key and the sender. Then verify the signature based on the public key. If the signature is not verified, it tells the user there is a message that not verified. If the signature is verified, the function will decrypt the message into plaintext and print the plaintext for the user.

    当服务从其他服务接收数据时,将执行此功能。 放置所有必需的功能以使数据对用户可用。 首先,它匹配公钥和发送者。 然后根据公钥验证签名。 如果签名未通过验证,则会告诉用户有未验证的消息。 如果签名经过验证,该功能会将消息解密为纯文本并为用户打印纯文本。

    服务主要 (Service Main)

    To make all function executable, we need to build the main function with HTTP routing.

    为了使所有功能可执行,我们需要使用HTTP路由构建主要功能。

    During the service initiation, it will read the flag to allow one service to be deployed by every party. The service required 3 flag

    在服务启动期间,它将读取该标志以允许每一方部署一项服务。 该服务需要3个标志

    • name: the service user — service will use the private key that matches the user name

      名称:服务用户-服务将使用与用户名匹配的私钥
    • contacts: is the partner's name separated in comma ‘,’ — service will use the partner public key that matches the partner's name

      通讯录:是合作伙伴的名称,中间用逗号' '分隔-服务将使用与合作伙伴名称匹配的合作伙伴公钥

    • port: is the port that the service will run

      端口:服务将运行的端口

    And that will be all, the service is able to do two full flow, sending data and receiving data.

    仅此而已,该服务能够执行两个完整的流程,即发送数据和接收数据。

    测试中 (Testing)

    To test the service, we need to build the Go file. Example to build the service with the name secure-comm is following:

    为了测试服务,我们需要构建Go文件。 以下是使用secure-comm名称构建服务的示例:

    go build -o secure-comm

    Copy the file into two different folders for Alice and Bob. Put Alice’s Private key and Bob’s public key into folder Alice. Put Bob’s private key and Alice’s public key in folder Bob.

    将文件复制到Alice和Bob的两个不同文件夹中。 将Alice的私钥和Bob的公钥放入文件夹Alice。 将Bob的私钥和Alice的公钥放在文件夹Bob中。

    ➜  test git:(master) ✗ tree
    .
    ├── alice
    │ ├── alice-private.pem
    │ ├── bob-public.pem
    │ └── secure-comm
    └── bob
    ├── alice-public.pem
    ├── bob-private.pem
    └── secure-comm

    Now run this command on folder Alice

    现在在文件夹Alice上运行此命令

    ./secure-comm -name=alice -contacts=bob -port=8080

    The command use Alice for name’s flag, Bob for contacts’s flag and 8080 for the port’s flag. Running in default gin HTTP routing configuration, the output will be like this.

    该命令使用Alice作为名称的标志,使用Bob作为联系人的标志,并使用8080作为端口的标志。 在默认的gin HTTP路由配置中运行,输出将如下所示。

    Image for post
    Running the service at folder Alice
    在文件夹Alice上运行服务

    Run the following command in folder Bob.

    在文件夹Bob中运行以下命令。

    ./secure-comm -name=bob -contacts=alice -port=8081

    It works similar way like previous command execution for folder Alice except for the different port — which is 8081. It means the service is running in 8081.

    它的工作方式与文件夹Alice的先前命令执行类似,只是端口不同(8081)。这表示该服务正在8081中运行。

    Now, we need to test the communication. Here is the HTTP call in the CURL command simulating scenario where Alice sends the message to Bob.

    现在,我们需要测试通信。 这是CURL命令模拟场景中的HTTP调用,其中Alice将消息发送给Bob。

    curl --location --request POST 'http://localhost:8080/send' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'receiver=bob' \
    --data-urlencode 'host=http://localhost:8081/receive' \
    --data-urlencode 'message=hello Bob, how are you'

    The service in folder Alice will response with the following response. This means the data is sent to Bob encrypted.

    文件夹Alice中的服务将响应以下响应。 这意味着数据已加密发送到Bob。

    {"ciphertext": "i5WGunu3+qMTUTaClS09whPhtxDn3mKMahcMQPo7IHmQEutIeDuGzJkoS7i/kDl85DLv0YgHJtdF6kuR99u9SBL7SMN3PdhqtyPpDyEZal6H8N+4wndB688Cw0SRtOIHJraDFbrBTt2bB13gRQX1l+VNv5MwsDswJ9Gv3UsaKL6Gpi2SatD/BcAsSd7bTeM8cS7ekZ55lV45Ll7je84cKVa7auOvWwuFiY8QdGEJBer0MQ96yB92cPxxvN9/kLfwQ2i0b2d1F1LrWstXDu26wXIiROmAgeQeIahx8+lTFGedLR8y2yY5xvdBAG7caYMgRl1yniSQXVp9we33LOMAuA=="}

    When we check on folder Bob service, the service will print out the message from Alice.

    当我们检查文件夹Bob服务时,该服务将打印出来自Alice的消息。

    Image for post
    Message from Alice to Bob
    爱丽丝给鲍勃的信

    That’s mean the Bob will be able to read the message from Alice. End-to-end testing is complete.

    这意味着鲍勃将能够从爱丽丝那里读取消息。 端到端测试已完成。

    Bob actually able to reply by doing an HTTP call to the service in folder Bob at port 8081. Here is the screenshot of a conversation between Alice and Bob using the secure data transfer service.

    实际上,Bob可以通过对端口8081处的文件夹Bob中的服务进行HTTP调用来进行回复。这是Alice和Bob之间使用安全数据传输服务的对话的屏幕截图。

    Image for post
    Conversation between Alice and Bob
    爱丽丝与鲍勃之间的对话

    脚注 (Footnote)

    The service we build here is aligned with the two security principles — Confidentiality and Integrity. The implementation, of course, can be adjusted to real-life business cases. As long as the flow and component are the same, this service can be built in various other languages. The full code repository is available here

    我们在此处构建的服务符合两个安全原则-机密性和完整性。 当然,可以根据实际业务案例调整实施方式。 只要流程和组件相同,就可以使用其他各种语言来构建此服务。 完整的代码存储库可在此处获得

    Prerequisites for using this service are having a pair of RSA Keys. Here is how to generate the RSA Keys.

    使用此服务的前提条件是必须具有一对RSA密钥。 这是生成RSA密钥的方法。

    Hopefully, this service will be useful to you. What do you think the next improvement would be?

    希望这项服务对您有用。 您认为下一个改进是什么?

    翻译自: https://medium.com/swlh/building-a-secure-data-transfer-service-using-rsa-asymmetric-encryption-in-go-3a656c9309c1

    vue使用rsa非对称加密

    展开全文
  • RSA非对称加密通信源码
  • 一行代码轻松实现RSA非对称加密iOS
  • RSA非对称加密的RSA.zip

    2019-06-11 17:21:23
    RSA非对称加密所需的jar包和js文件,亲测可用,可直接配合RSA文件使用
  • RSA非对称加密通信非对称加密是非常安全的一类加密算法TXQQ客户Duan的通信也用了椭圆曲线非对称加密(ECC)非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果...

    RSA非对称加密通信

    非对称加密是非常安全的一类加密算法

    TXQQ客户Duan的通信也用了椭圆曲线非对称加密(ECC)

    非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。

    公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;

    如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。

    因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

    非对称加密算法实现机密信息交换的基本过程是:

    甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;

    得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

    简单来说

    非对称加密

    公钥加密私匙解密 私匙加密公匙解密

    公钥加密的内容公钥不能解密

    私匙加密加密的内容私匙不能解密

    私匙可以算出公匙 公匙不可能逆推算出私匙  (理论上不能)

    PS:不用每次都重新生成密匙  服务端启动时自动载入目录下的私匙

    @陈乃程

    文件下载

    解压密码:

    来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575)

    展开全文
  • 基于.Net的MVC模拟登录,RSA非对称加密,web前端加密,C#后端解密。
  • RSA非对称加密帮助类

    2016-12-22 16:17:08
    RSA非对称加密帮助类及说明文档
  • .net RSA非对称加密例子

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,817
精华内容 2,326
关键字:

rsa非对称加密