当前位置: 代码迷 >> J2SE >> 小弟我今天写的Rsa加密算法,大家看看如何样 新手多多指导
  详细解决方案

小弟我今天写的Rsa加密算法,大家看看如何样 新手多多指导

热度:70   发布时间:2016-04-24 00:53:00.0
我今天写的Rsa加密算法,大家看看怎么样 新手多多指导
Java code
package com.bxuanzhao.key;import java.math.*;import java.util.Random;import java.util.Scanner;public class RsaFactory {    public BigInteger publicKeyN, publicKeyE;  //公钥    private BigInteger privateKey;             //私钥    BigInteger p, q;    public RsaFactory(BigInteger p, BigInteger q) {        this.p = p;        this.q = q;        publicKeyN = p.multiply(q);        this.publicKeyE =  getPublicKeyE();        this.privateKey = getPrivateKey();        System.out.println("公钥E: " + publicKeyE);        System.out.println("公钥N: " + publicKeyN);        System.out.println("私钥: " + privateKey);    }        public BigInteger getPublicKeyE () {        Random rand = new Random();        publicKeyE = BigInteger.probablePrime(40,rand);                return publicKeyE;    }        public BigInteger getPrivateKey () {        BigInteger fn = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));        privateKey = publicKeyE.modInverse(fn);                return privateKey;    }        public BigInteger Encryption(BigInteger msg) {        BigInteger cipher = msg.modPow(publicKeyE, publicKeyN);        //System.out.println("密文: "+ cipher);        return cipher;    }        public BigInteger decryp(BigInteger cipher) {        BigInteger msg = cipher.modPow(privateKey, publicKeyN);        //System.out.println("明文:" + msg);        return msg;    }        public void rsa(String msg) {        int m;         String s;        char[] msgArr = msg.toCharArray();        int length = msgArr.length;        String[] cipherStr = new String[length];                BigInteger cipher[] = new BigInteger[length];        BigInteger text[] = new BigInteger[length];        for(int i=0; i<length; i++) {                 //加密成cipherStr            m = (int)msgArr[i];            s = String.valueOf(m);            text[i] = new BigInteger(s);                    cipher[i] = this.Encryption(text[i]);                cipherStr[i] = cipher[i].toString(16);       //加密后的密文        }                char[] clearMsg = new char[length];                for(int i=0; i<length; i++) {                  //解密            text[i] = new BigInteger(cipherStr[i],16);            m = this.decryp(text[i]).intValue();            clearMsg[i] = (char)m;                    //解密后的明文        }                System.out.println("加密后的密文为:");        for(int i=0; i<length; i++)             System.out.print(cipherStr[i]);                System.out.println("\n"+"解密后的密文为:");        for(int i=0; i<length; i++)             System.out.print(clearMsg[i]);    }        public static void main(String[] arg) {        Random rand = new Random();        BigInteger p = BigInteger.probablePrime(20,rand);        BigInteger q = BigInteger.probablePrime(20,rand);        RsaFactory rsa = new RsaFactory(p, q);        String mesg;        System.out.println("输入要加密的消息:");        Scanner sc = new Scanner(System.in);        mesg = sc.nextLine();            if(mesg != null)            rsa.rsa(mesg);        else            System.out.println("没有需要加密的消息");    }}


------解决方案--------------------
你这个只是 RSA 数学理论的实现,并不是 RSA 算法。

RSA 公私钥对的数据结构以及要求和规范需要查看 PKCS#1 标准文档

PKCS #1: RSA Cryptography Standard
http://www.rsa.com/rsalabs/node.asp?id=2125

RFC 3447 - Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1
http://tools.ietf.org/html/rfc3447

另外,RSA 用于数据加密的情况下,对于原始数据字节长度是有限制的,比如 RSA 1024 最多只能处理 117 个字节的原始数据。
  相关解决方案