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数组最大长度还要小)
     
      
  • 相关阅读:
    正则表达式练习
    Linux下文件删除的原理
    (转)linux grep 正则表达式
    linux 需要记忆的知识
    linux 常用命令
    TestNG测试方法
    TestNG配置注解
    jquery 获取和设置 select下拉框的值
    Kings(状压DP)
    Tirp(状压DP)
  • 原文地址:https://www.cnblogs.com/gameshan/p/4800612.html
Copyright © 2011-2022 走看看