zoukankan      html  css  js  c++  java
  • RSA加密

    RSA 算法

    若要生成密钥对,可以从创建名为 p 和 q 的两个大的质数开始。 这两个数相乘,结果称为 n。 因为 p 和 q 都是质数,所以 n 的全部因数为 1、 p、 q 和 n。

    如果仅考虑小于 n 的数,则与 n 为互质数(即与 n 没有公因数)的数的个数等于 (p - 1)(q - 1)。

    现在,选择一个数 e,它与计算的值为互质数。 则公钥表示为 {e, n}。

    若要创建私钥,则必须计算 d,它是满足 (d)(e) mod n = 1 的一个数。 根据 Euclidean 算法,私钥为 {d, n}。

    纯文本 m 到密码文本 c 的加密定义为 c = (m ^ e) mod n。 解密则定义为 m = (c ^ d) mod n。  

    RSAParameters 字段

    Contains

    对应的 PKCS #1 字段

    D

    d,私钥指数

    privateExponent

    DP

    d mod (p - 1)

    exponent1

    DQ

    d mod (q - 1)

    exponent2

    Exponent

    e,公钥指数

    publicExponent

    InverseQ

    (InverseQ)(q) = 1 mod p

    coefficient

    Modulus

    n

    modulus

    P

    p

    prime1

    Q

    q

    prime2

    RSA 的安全性基于这样的事实,给定公钥 { e, n },无论是直接计算还是通过将 n 因式分解为 p 和 q,要计算出 d 都是不可行的。 因此,与 d、 p 或 q 相关的任何密钥部分都必须保密。 如果您调用

    ExportParameters 并且仅请求公钥信息,这就是您将仅收到 ExponentModulus 的原因。 仅当您具有对私钥的访问权限并且请求私钥时,其他字段才可用。

    RSAParameters 不以任何方式加密,因此将它与私钥信息一起使用时应谨慎。 实际上,包含私钥信息的任何字段都不可序列化。如果尝试通过远程调用或通过使用序列化程序之一来序列化 RSAParameters 结构,将仅接收到公钥信息。 如果希望传递私钥信息,则必须手动发送该数据。在任何情况下,如果任何人能够获知这些参数,您传送的密钥将毫无用处。

     --------------------------------------------------------------------------------------------------------------------------------------------------------------

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
    RSA的算法涉及三个参数,n、e1、e2。
    其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
    e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
    (n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。[1] 
    RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
    e1和e2可以互换使用,即:
    A=B^e1 mod n;B=A^e2 mod n;
     
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------
    RSA算法描述:
    (1)选择一对不同的、足够大的素数p,q。
    (2)计算n=pq。
    (3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
    (4)找一个与f(n)互质的数e,且1<e<f(n)。
    (5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)
    这里要解释一下,≡是数论中表示同余的符号。公式中,≡符号的左边必须和符号右边同余,也就是两边模运算结果相同。显而易见,不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;符号的左边d与e的乘积做模运算后的结果也必须等于1。这就需要计算出d的值,让这个同余等式能够成立。
    (6)公钥KU=(e,n),私钥KR=(d,n)。
    (7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:
    (8)解密过程为:。 
     
    指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。 
      模指数运算就是先做指数运算,取其结果再做模运算。如
     
    -----------------------------------------------坑出现(各种标准)--------------------------------------------------------------------------
    1.RSA算法只对入参,出参都是byte数组,而byte数组如何和字符串进行转换有坑
    2.RSA的实现有各种标准
      填充算法:NoPadding、ISO10126Padding、OAEPPadding、PKCS1Padding、PKCS5Padding、SSL3Padding
      反馈模式:NONE、CBC 、CFB/CFBx、CTR、CTS、ECB、OFB/OFBx、PCBC
      .NET 自带RSA算法:只有一种 RSA-PKCS1-KeyEx (同一公钥每次加密同一字符串结果都不一样)
      Java 自带多种算法:Cipher.getInstance("RSA")  可能等同于 Cipher.getInstance("RSA/ECB/PKCS1Padding")也可能不同
    3.公钥,私钥如何序列化为字符串有多种标准
      .NET 序列化为XML格式,值用字符显示(Base64将byte数组转为字符)
      Java 序列化值用数字显示()
    4.每次加密时做为入参的byte数组最大长度为密匙位数(如果有什填充,反抗算法,入参byte数组最大长度还要小)
     
      
  • 相关阅读:
    169. Majority Element
    283. Move Zeroes
    1331. Rank Transform of an Array
    566. Reshape the Matrix
    985. Sum of Even Numbers After Queries
    1185. Day of the Week
    867. Transpose Matrix
    1217. Play with Chips
    766. Toeplitz Matrix
    1413. Minimum Value to Get Positive Step by Step Sum
  • 原文地址:https://www.cnblogs.com/gameshan/p/4800612.html
Copyright © 2011-2022 走看看