`
yjhexy
  • 浏览: 331211 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

RSA 算法原理

阅读更多

<一>基础

RSA算法非常简单,概述如下:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)
取d*e%t==1

(其中,公钥的exponent即RSA算法中的e, e通常是3,17和65537
X.509建议使用65537,PEM建议使用3,PKCS#1建议使用3或65537,一般来说,都是选择3。)

这样最终得到三个数: n  d  e

 


设消息为数M (M <n)
设c=(M**d)%n就得到了加密后的消息c
设m=(c**e)%n则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。

在对称加密中:
n e两个数构成公钥,可以告诉别人;
n d两个数构成私钥,d自己保留,不让任何人知道。
给别人发送的信息使用d加密,只要别人能用e解开就证明信息是由你发送的
别人给你发送信息时使用e加密,这样只有拥有d的你能够对其解密。



rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解
从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法
求得d。

 


以上原理详见维基百科:http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95#.E5.85.AC.E9.92.A5.E5.92.8C.E7.A7.81.E9.92.A5.E7.9A.84.E4.BA.A7.E7.94.9F


<二>实践

package com.yajun.rsa;

import java.io.Serializable;
import java.math.BigInteger;
import java.security.SecureRandom;

/**
 * RSA 算法原理实现
 * 
 * @author Administrator
 */
public class RSA implements Serializable {
    private static final long         serialVersionUID = 7935341891569534021L;

    private final static BigInteger   one              = BigInteger.ONE;
    private final static SecureRandom random           = new SecureRandom();
    private BigInteger                privateKey       = null;
    private BigInteger                publicKey        = null;
    private BigInteger                modulus          = null;
    private BigInteger                p1               = null;
    private BigInteger                p2               = null;
    //Ces variables doivent être initialisé pour l'encrytage de données.
    private BigInteger                modulusE;
    private BigInteger                publicKeyE;
    private int                       N;
    private BigInteger                phi0;

    public RSA(int N) {
        this.N = N;
        // generate an N-bit (roughly) public and private key
        //clés privé
        //p1
        p1 = BigInteger.probablePrime(N / 2, random);
        //p2
        p2 = BigInteger.probablePrime(N / 2, random);
        //t
        phi0 = (p1.subtract(one)).multiply(p2.subtract(one));
        //n
        modulus = p1.multiply(p2);
        //d
        setPrivateKey();
        //e
        publicKey = privateKey.modInverse(phi0);
        modulusE = modulus;
        publicKeyE = publicKey;
    }

    public BigInteger getModulus() {
        return modulus;
    }

    public BigInteger getPublicKey() {
        return publicKey;
    }

    public void setPublicKey(BigInteger p, BigInteger n) {
        publicKeyE = p;
        modulusE = n;
    }

    /**
     * 这部分没怎么看懂
     */
    private void setPrivateKey() {
        do {
            privateKey = BigInteger.probablePrime(N / 2, random);
        } while (privateKey.gcd(phi0).intValue() != 1 || privateKey.compareTo(modulus) != -1
                || privateKey.compareTo(p1.max(p2)) == -1);
    }

    /**
     * 加密
     * 
     * @param message
     * @return
     */
    public BigInteger encrypt(BigInteger message) {
        BigInteger rep = null;
        String str_message = new String(message.toByteArray());
        if (message != null) {
            if (str_message.length() <= (N / 8)) {
                if (publicKeyE != null && modulusE != null
                        && message.toByteArray().length < Integer.MAX_VALUE) {
                    rep = message.modPow(publicKeyE, modulusE);
                }
            }
        }
        return rep;
    }

    /**
     * 加密,公式比较容易看懂
     * 
     * @param message
     * @param publicKeyP
     * @param modulusP
     * @return
     */
    public BigInteger encrypt(BigInteger message, BigInteger publicKeyP, BigInteger modulusP) {
        BigInteger rep = null;
        String str_message = new String(message.toByteArray());
        if (str_message.length() <= (N / 8)) {
            if (publicKeyP != null && modulusP != null
                    && message.toByteArray().length < Integer.MAX_VALUE) {
                rep = message.modPow(publicKeyP, modulusP);
            }
        }
        return rep;
    }

    /**
     * 解密,公式也比较容易看懂
     * 
     * @param encrypted
     * @return
     */
    public BigInteger decrypt(BigInteger encrypted) {
        return encrypted.modPow(privateKey, modulus);
    }

    public String toString() {
        String s = "";
        s += "public  = " + publicKey + "\n";
        s += "modulus = " + modulus;
        return s;
    }

    public static void main(String[] args) {
        BigInteger message = BigInteger.valueOf(88);
        RSA rsa = new RSA(512);
        BigInteger enInteger = rsa.encrypt(message);
        BigInteger deInteger = rsa.decrypt(enInteger);
        System.out.println(enInteger);
        System.out.println(deInteger);
    }
}

 

分享到:
评论

相关推荐

    RSA算法原理.doc

    RSA 算法原理 RSA 算法是非对称加密算法的代表,广泛应用于计算机网络安全领域。该算法的原理基于数论,主要包括互质关系、欧拉函数、模指数运算和中国剩余定理等概念。 一、互质关系 互质关系是指两个正整数除了...

    RSA算法原理-包括KEY产生原理

    以下是RSA算法原理的详细解释: 1. **密钥生成**: - 首先,选取两个大素数p和q,它们应该足够大以增加破解的难度,且p和q互不相同。 - 计算n=p*q,n作为模数,是公钥和私钥的一部分。 - 然后计算欧拉函数φ(n)=...

    rsa算法原理

    主要对网络中数据传输rsa加密的原理介绍,包括数学理论和代码开发应用

    C实现-RSA算法原理与实现

    在"第六章 RSA算法原理与实现"中,可能包含了以上所有这些步骤的详细实现,包括代码示例、函数定义以及可能出现的优化技巧。学习这部分内容将有助于深入理解RSA算法的工作原理,并能实际编写出能够加密和解密数据的C...

    RSA算法原理及应用示例.doc

    RSA算法原理及应用示例.doc

    RSA算法原理

    在了解RSA算法的原理之前,我们需要先掌握几个数论中相关的概念,包括互质关系、欧拉函数、欧拉定理、模反元素以及密钥生成的步骤。这些概念构成了RSA算法的数学基础。 互质关系是指两个整数a和b的最大公约数(GCD...

    RSA算法原理与实现_密码学源代码_C语言程序_C++程序源代码

    ### RSA算法原理 RSA的核心在于两个大素数的乘积,这个乘积称为模数N。选择两个大素数p和q,计算它们的乘积N=p*q,然后计算欧拉函数φ(N)=(p-1)*(q-1)。接下来,选取一个与φ(N)互质的数e作为公钥的指数,通常e取为...

    RSA算法原理与实现

    RSA算法原理与C语言实现 运行环境:WINDOWS下VC6.0及以上编程工具 运行方式:(1)WINDOWS下VC6.0及以上编程工具编译链接运行 (2)工程文件夹下Debug下的*.exe

    RSA.rar_RSA PPT_RSA 算法 介绍_RSA 算法 原理_加密_加密 rsa

    PPT(PowerPoint演示文稿)可能是对RSA算法的详细讲解,包括其历史背景、数学原理、加密解密步骤、安全性分析以及实际应用案例。而www.pudn.com.txt可能是一个链接或引用来源,用于提供更多的阅读材料或参考资料。 ...

    RSA算法实验报告 通过对RSA算法的实现,深入了解RSA原理及应用

    实验目的在于通过实践加深对RSA算法原理的理解和应用。在公钥密码体制中,RSA算法的独特之处在于它能够同时用于数据加密和数字签名。加密过程使用公钥,解密过程使用私钥,这一特性使得RSA在开放的网络环境中具有较...

    RSA算法原理与实现课程设计.docx

    RSA算法是一种非对称加密算法,它在网络安全和信息安全领域有着重要的应用。该算法由Rivest、Shamir和Adleman三位科学家在1978年提出,基于数论中的大整数素因子分解难题,是最早的公钥密码系统之一。RSA的工作原理...

    RSA算法的纯Python实现(源码)

    RSA算法的纯Python实现,...RSA算法原理基于两个大质数的乘积很难因式分解,几种算法的优劣主要体现在质数判断、快速乘模运算、快速幂模运算等。如需实际应用建议使用大能们的实现:https://pypi.python.org/pypi/rsa/

    RSA算法原理以及证明

    RSA算法是一种非对称加密技术,它在信息安全领域扮演着重要的角色,被广泛应用于数据加密和数字签名。该算法由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家于1977年提出,因此以他们的名字命名。RSA的安全性...

    rsa算法原理[参考].pdf

    RSA算法是一种非对称加密算法,它基于数论中的大数因子分解难题,广泛应用于软件开发中的数据加密、数字签名等领域。...同时,理解RSA算法的数学基础和密钥生成原理对于实现和使用该算法至关重要。

    Delphi中的经典RSA算法源码示例

    **RSA算法原理:** 1. **公钥与私钥**:RSA的核心在于一对密钥,一个为公钥,另一个为私钥。公钥可以公开,而私钥必须保密。 2. **大素数选取**:RSA算法首先需要选择两个大素数p和q,它们的乘积n=p*q作为模数。 3. ...

    密码学RSA算法

    1. **RSA算法原理** RSA的核心基于两个大素数的乘积,即N=p*q,p和q是随机选取的大素数。计算N的欧拉函数φ(N)=(p-1)*(q-1),然后选取一个与φ(N)互质的整数e作为公钥的指数,同时计算e对于φ(N)的模逆d作为私钥的...

    RSA-master.rar_C语言_RSA C语言_RSA算法_rsa c++_rsa算法实现

    1. **RSA算法原理**: RSA算法基于大整数因子分解的困难性。它使用一对公钥和私钥,其中公钥可以公开,而私钥必须保密。加密过程使用接收者的公钥,解密则用发送者的私钥。其基本步骤包括选取两个大素数p和q,计算...

    RSA算法实现数字及字符的加解密(完整工程)

    项目需要编写的MFC测试小程序(编译环境VS2015) 1、实现RSA算法密匙n、e、d 的自动生成; 2、根据当前的密匙对输入数字进行加解密... 5、RSA算法原理可参考https://blog.csdn.net/wm_1991/article/details/51954565

    Rsa算法详解.docx

    #### 二、RSA算法原理 ##### 1. 密钥生成 - **选择两个大素数**:首先选取两个足够大的素数`p`和`q`,为了提高安全性,这两个素数应具有相似的长度。 - **计算乘积n**:计算这两个素数的乘积`n = p × q`,这个值将...

Global site tag (gtag.js) - Google Analytics