使用RSA加密算法完成支付(一)

   直到今天,我才不再认为“RSA算法只在考试用过”,因为最近做的支付就用到了这个算法,我才可以有理有据地告诉我自己:“RSA不单单在考试用到啊!”。你要问我为什么,我只能告诉你,继续看下去!

◔ 加密历史

  不知道提到加密算法,正在看博客的你,最先想到的是哪种加密?

  

  我只能告诉你,我最先想到的是公钥加密,这是一种很6的加密。因为在公钥加密出现之前,所有的加密都是一种模型:

 1)甲使用某种规则对文件加密,将文件和加密方式告诉乙;

 2)乙使用同一种规则对文件进行解密;

  在上述模式(也就是俗称的“对称加密”)中,人们不得不为秘钥的保存和传递进行担忧,因为在这个加密过程中,甲必须将加密的规则告诉乙,否则乙方无法完成解密;这个让加密专家头疼的问题一直持续到--Rivest、Shamir 和 Adleman 这三个人在1977年提出的“非对称加密”算法。这种算法就是我们一直在说的“RSA加密算法”;

  这种算法非常可靠,因为它使用的秘钥越长,破解难度系数就会越高,这样文件的传输过程就会越安全。据记载,目前被破解的最长RSA秘钥是768个二进制位。也就是说,当前秘钥长度超过768位的秘钥,还无人能破解。所以我们基本上可以认为:1024位的RSA秘钥基本安全,2048位的秘钥及其安全。

◔ RSA算法的必备知识

  要想知道RSA公钥和私钥的秘密,我们需要先回顾一些数学知识:素数、互质数、指数运算、模运算;下面举一个栗子:

  主人公就是大家熟悉的:李雷和韩梅梅;

  李雷要向韩梅梅传递消息,但是不想轻易的被别人破解,所以对这则消息进行了加密:

  ▶ 选择两个不相等的比较大的质数(X,Y),并且计算出X与Y的乘积Z;

   李雷选择的这两个质数分别是 61和53(实际应用中,这两个质数越大,就破解的难度系数就越高),并计算出两个质数的乘积:Z = 61 * 53 = 3233;也就意味着当前秘钥的长度是3233 的二进制位,也就是110010100001,一共12位,所以当前李雷使用的秘钥就是12位;

  ▶ 使用叫 欧拉函数 的这个东西,计算出r = (X-1)(Y-1)

   计算所得:3120;

  ▶ 随机选择一个整数e,确保1 < e < r,而且e和r互质;

   李雷在1和3120之间随机选择了17,;

 ▶ 利用公式: e * d = 1(mod r)计算出一组整数解(a,b)=(2753,-15)

 ▶ 组装私钥和公钥

  上述过程中,Z=3233,e=17,d=2753,所以李雷获取到的公钥就是(3233,17),私钥就是(3233,2753);

 所以整个过程归为一张图就是:

 

 借用一个例子给大家展示RSA算法的实例:

public class RSA {  
    /** 
     *  加密、解密算法 
     * @param key 公钥或密钥 
     * @param message 数据 
     * @return 
     */  
    public static long rsa(int baseNum, int key, long message){  
        if(baseNum < 1 || key < 1){  
            return 0L;  
        }  
        //加密或者解密之后的数据  
        long rsaMessage = 0L;  
          
        //加密核心算法  
        rsaMessage = Math.round(Math.pow(message, key)) % baseNum;  
        return rsaMessage;  
    }  
      
      
      
    public static void main(String[] args){  
        //基数  
        int baseNum = 3 * 11;  
        //公钥  
        int keyE = 3;  
        //密钥  
        int keyD = 7;  
        //未加密的数据  
        long msg = 24L;  
        //加密后的数据  
        long encodeMsg = rsa(baseNum, keyE, msg);  
        //解密后的数据  
        long decodeMsg = rsa(baseNum, keyD, encodeMsg);  
          
        System.out.println("加密前:" + msg);  
        System.out.println("加密后:" + encodeMsg);  
        System.out.println("解密后:" + decodeMsg);  
          
    }    
}  
 程序运行执行的结果为:

加密前:24

加密后:30

解密后:24

 以上就是RSA算法加密解密的相关东西,关于支付的相关知识会在下篇中写到,谢谢大家关注!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值