当前位置:首页 » 编程语言 » rsa加密解密java

rsa加密解密java

发布时间: 2023-12-11 20:26:28

㈠ 有一段用java实现rsa加解密的程序看不懂,希望高手帮我做下注释,详细些,谢谢

//引入文件
import java.security.*;
import javax.crypto.*;
/**
* RSACryptography
* RSACryptography use the privated key to encrypt the plain text and decrypt
* the cipher text with the public key
*/
public class RSACryptography {
Cipher cipher;
/**
构造函数,就是你每次new这个对象RSACryptography 时候就会执行里面的方法
返回一个Cipher对象(其实他就是用来加密解密的)
*/

public RSACryptography() {
try {
cipher = Cipher.getInstance("RSA");//返回一个cipher对象,该类
//应该是单例的
} catch (NoSuchAlgorithmException e) {//抛出异常,没什么说的
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}

/**
好了,重点来了,你需要加密解密的就调用这个方法encrypt_decrypt(),传入一个byte[]的类型值byteInput,,就是你要加密的东西,在传入一个key,这个key 就像钥匙一样,你根据这个key进行加密,也可以根据这个key进行解密的,boolean 类型的 crypto,如果true就是加密,false就是解密
*/
public byte[] encrypt_decrypt(byte[] byteInput, Key key, boolean crypto) {
try {
if(crypto){
cipher.init(Cipher.ENCRYPT_MODE,key);//加密前初始化
}else{
cipher.init(Cipher.DECRYPT_MODE,key);//解密前初始化
}
byte[] cipherByte = cipher.doFinal(byteInput);//进行加密或解密
return cipherByte;//返回你的加密或者解密值类型为byte[]
} catch (InvalidKeyException e) {//抛出异常
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}

}

㈡ java 生成的rsa私钥怎么给ios解密

java使用jdk的KeyPairGenerator 生成公钥和私钥;
java服务端把公钥转化为一个字符串发送给ios端;
然后ios端根据此字符串还原公钥,使用公钥进行加密;
服务端使用秘钥进行解密;
逻辑是这样的没问题,可是语言不通,java发送出来的字符串IOS不一定能还原成公钥,就算有还原的方法,还原了也不一定对(与java端私钥不对称);同理私钥也一样

㈢ Java 第三方公钥 RSA加密求助

下面是RSA加誉春密代码。

/**
* RSA算法,实现数据的加密解密。
* @author ShaoJiang
*
*/
public class RSAUtil {

private static Cipher cipher;

static{
try {
cipher = Cipher.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
}
}

/**
* 生成密钥对
* @param filePath 生成密钥做含的路径
* @return
*/
public static Map<String,String> generateKeyPair(String filePath){
try {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 密钥位数
keyPairGen.initialize(1024);
// 密钥对
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
//得到公钥字符串
String publicKeyString = getKeyString(publicKey);
//得到私钥字符串
String privateKeyString = getKeyString(privateKey);

FileWriter pubfw = new FileWriter(filePath+"/publicKey.keystore"纯虚笑);
FileWriter prifw = new FileWriter(filePath+"/privateKey.keystore");
BufferedWriter pubbw = new BufferedWriter(pubfw);
BufferedWriter pribw = new BufferedWriter(prifw);
pubbw.write(publicKeyString);
pribw.write(privateKeyString);
pubbw.flush();
pubbw.close();
pubfw.close();
pribw.flush();
pribw.close();
prifw.close();
//将生成的密钥对返回
Map<String,String> map = new HashMap<String,String>();
map.put("publicKey",publicKeyString);
map.put("privateKey",privateKeyString);
return map;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* 得到公钥
*
* @param key
* 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PublicKey getPublicKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = (new BASE64Decoder()).decodeBuffer(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}

/**
* 得到私钥
*
* @param key
* 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PrivateKey getPrivateKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = (new BASE64Decoder()).decodeBuffer(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}

/**
* 得到密钥字符串(经过base64编码)
*
* @return
*/
public static String getKeyString(Key key) throws Exception {
byte[] keyBytes = key.getEncoded();
String s = (new BASE64Encoder()).encode(keyBytes);
return s;
}

/**
* 使用公钥对明文进行加密,返回BASE64编码的字符串
* @param publicKey
* @param plainText
* @return
*/
public static String encrypt(PublicKey publicKey,String plainText){
try {
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] enBytes = cipher.doFinal(plainText.getBytes());
return (new BASE64Encoder()).encode(enBytes);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}

/**
* 使用keystore对明文进行加密
* @param publicKeystore 公钥文件路径
* @param plainText 明文
* @return
*/
public static String encrypt(String publicKeystore,String plainText){
try {
FileReader fr = new FileReader(publicKeystore);
BufferedReader br = new BufferedReader(fr);
String publicKeyString="";
String str;
while((str=br.readLine())!=null){
publicKeyString+=str;
}
br.close();
fr.close();
cipher.init(Cipher.ENCRYPT_MODE,getPublicKey(publicKeyString));
byte[] enBytes = cipher.doFinal(plainText.getBytes());
return (new BASE64Encoder()).encode(enBytes);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* 使用私钥对明文密文进行解密
* @param privateKey
* @param enStr
* @return
*/
public static String decrypt(PrivateKey privateKey,String enStr){
try {
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] deBytes = cipher.doFinal((new BASE64Decoder()).decodeBuffer(enStr));
return new String(deBytes);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

/**
* 使用keystore对密文进行解密
* @param privateKeystore 私钥路径
* @param enStr 密文
* @return
*/
public static String decrypt(String privateKeystore,String enStr){
try {
FileReader fr = new FileReader(privateKeystore);
BufferedReader br = new BufferedReader(fr);
String privateKeyString="";
String str;
while((str=br.readLine())!=null){
privateKeyString+=str;
}
br.close();
fr.close();
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKeyString));
byte[] deBytes = cipher.doFinal((new BASE64Decoder()).decodeBuffer(enStr));
return new String(deBytes);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

㈣ 如何实现用javascript实现rsa加解密

  1. 服务端生成公钥与私钥,保存。

  2. 客户端在请求到登录页面后,随机生成一字符串。

  3. 后此随机字符串作为密钥加密密码,再用从服务端获取到的公钥加密生成的随机字符串

  4. 将此两段密文传入服务端,服务端用私钥解出随机字符串,再用此私钥解出加密的密文。这其中有一个关键是解决服务端的公钥,传入客户端,客户端用此公钥加密字符串后,后又能在服务端用私钥解出。

步骤:

  1. 服务端的RSAJava实现:

    /**
    *
    */
    packagecom.sunsoft.struts.util;

    importjava.io.ByteArrayOutputStream;
    importjava.io.FileInputStream;
    importjava.io.FileOutputStream;
    importjava.io.ObjectInputStream;
    importjava.io.ObjectOutputStream;
    importjava.math.BigInteger;
    importjava.security.KeyFactory;
    importjava.security.KeyPair;
    importjava.security.KeyPairGenerator;
    importjava.security.NoSuchAlgorithmException;
    importjava.security.PrivateKey;
    importjava.security.PublicKey;
    importjava.security.SecureRandom;
    importjava.security.interfaces.RSAPrivateKey;
    importjava.security.interfaces.RSAPublicKey;
    importjava.security.spec.InvalidKeySpecException;
    importjava.security.spec.RSAPrivateKeySpec;
    importjava.security.spec.RSAPublicKeySpec;

    importjavax.crypto.Cipher;/**
    *RSA工具类。提供加密,解密,生成密钥对等方法。
    *需要到
    下载bcprov-jdk14-123.jar。
    *
    */
    publicclassRSAUtil{
    /**
    **生成密钥对*
    *
    *@returnKeyPair*
    *@throwsEncryptException
    */
    ()throwsException{
    try{
    KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    finalintKEY_SIZE=1024;//没什么好说的了,这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低
    keyPairGen.initialize(KEY_SIZE,newSecureRandom());
    KeyPairkeyPair=keyPairGen.generateKeyPair();
    saveKeyPair(keyPair);
    returnkeyPair;
    }catch(Exceptione){
    thrownewException(e.getMessage());
    }
    }

    publicstaticKeyPairgetKeyPair()throwsException{
    FileInputStreamfis=newFileInputStream("C:/RSAKey.txt");
    ObjectInputStreamoos=newObjectInputStream(fis);
    KeyPairkp=(KeyPair)oos.readObject();
    oos.close();
    fis.close();
    returnkp;
    }

    publicstaticvoidsaveKeyPair(KeyPairkp)throwsException{

    FileOutputStreamfos=newFileOutputStream("C:/RSAKey.txt");
    ObjectOutputStreamoos=newObjectOutputStream(fos);
    //生成密钥
    oos.writeObject(kp);
    oos.close();
    fos.close();
    }

    /**
    **生成公钥*
    *
    *@parammolus*
    *@parampublicExponent*
    *@returnRSAPublicKey*
    *@throwsException
    */
    (byte[]molus,
    byte[]publicExponent)throwsException{
    KeyFactorykeyFac=null;
    try{
    keyFac=KeyFactory.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    }catch(NoSuchAlgorithmExceptionex){
    thrownewException(ex.getMessage());
    }

    RSAPublicKeySpecpubKeySpec=newRSAPublicKeySpec(newBigInteger(
    molus),newBigInteger(publicExponent));
    try{
    return(RSAPublicKey)keyFac.generatePublic(pubKeySpec);
    }catch(InvalidKeySpecExceptionex){
    thrownewException(ex.getMessage());
    }
    }

    /**
    **生成私钥*
    *
    *@parammolus*
    *@paramprivateExponent*
    *@returnRSAPrivateKey*
    *@throwsException
    */
    (byte[]molus,
    byte[]privateExponent)throwsException{
    KeyFactorykeyFac=null;
    try{
    keyFac=KeyFactory.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    }catch(NoSuchAlgorithmExceptionex){
    thrownewException(ex.getMessage());
    }

    RSAPrivateKeySpecpriKeySpec=newRSAPrivateKeySpec(newBigInteger(
    molus),newBigInteger(privateExponent));
    try{
    return(RSAPrivateKey)keyFac.generatePrivate(priKeySpec);
    }catch(InvalidKeySpecExceptionex){
    thrownewException(ex.getMessage());
    }
    }

    /**
    **加密*
    *
    *@paramkey
    *加密的密钥*
    *@paramdata
    *待加密的明文数据*
    *@return加密后的数据*
    *@throwsException
    */
    publicstaticbyte[]encrypt(PublicKeypk,byte[]data)throwsException{
    try{
    Ciphercipher=Cipher.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    cipher.init(Cipher.ENCRYPT_MODE,pk);
    intblockSize=cipher.getBlockSize();//获得加密块大小,如:加密前数据为128个byte,而key_size=1024
    //加密块大小为127
    //byte,加密后为128个byte;因此共有2个加密块,第一个127
    //byte第二个为1个byte
    intoutputSize=cipher.getOutputSize(data.length);//获得加密块加密后块大小
    intleavedSize=data.length%blockSize;
    intblocksSize=leavedSize!=0?data.length/blockSize+1
    :data.length/blockSize;
    byte[]raw=newbyte[outputSize*blocksSize];
    inti=0;
    while(data.length-i*blockSize>0){
    if(data.length-i*blockSize>blockSize)
    cipher.doFinal(data,i*blockSize,blockSize,raw,i
    *outputSize);
    else
    cipher.doFinal(data,i*blockSize,data.length-i
    *blockSize,raw,i*outputSize);
    //这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到
    //ByteArrayOutputStream中,而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了
    //OutputSize所以只好用dofinal方法。

    i++;
    }
    returnraw;
    }catch(Exceptione){
    thrownewException(e.getMessage());
    }
    }

    /**
    **解密*
    *
    *@paramkey
    *解密的密钥*
    *@paramraw
    *已经加密的数据*
    *@return解密后的明文*
    *@throwsException
    */
    publicstaticbyte[]decrypt(PrivateKeypk,byte[]raw)throwsException{
    try{
    Ciphercipher=Cipher.getInstance("RSA",
    neworg.bouncycastle.jce.provider.BouncyCastleProvider());
    cipher.init(cipher.DECRYPT_MODE,pk);
    intblockSize=cipher.getBlockSize();
    ByteArrayOutputStreambout=newByteArrayOutputStream(64);
    intj=0;

    while(raw.length-j*blockSize>0){
    bout.write(cipher.doFinal(raw,j*blockSize,blockSize));
    j++;
    }
    returnbout.toByteArray();
    }catch(Exceptione){
    thrownewException(e.getMessage());
    }
    }

    /**
    ***
    *
    *@paramargs*
    *@throwsException
    */
    publicstaticvoidmain(String[]args)throwsException{
    RSAPublicKeyrsap=(RSAPublicKey)RSAUtil.generateKeyPair().getPublic();
    Stringtest="helloworld";
    byte[]en_test=encrypt(getKeyPair().getPublic(),test.getBytes());
    byte[]de_test=decrypt(getKeyPair().getPrivate(),en_test);
    System.out.println(newString(de_test));
    }
    }
  2. 测试页面IndexAction.java:

    /*
    *GeneratedbyMyEclipseStruts
    *Templatepath:templates/java/JavaClass.vtl
    */
    packagecom.sunsoft.struts.action;

    importjava.security.interfaces.RSAPrivateKey;
    importjava.security.interfaces.RSAPublicKey;

    importjavax.servlet.http.HttpServletRequest;
    importjavax.servlet.http.HttpServletResponse;

    importorg.apache.struts.action.Action;
    importorg.apache.struts.action.ActionForm;
    importorg.apache.struts.action.ActionForward;
    importorg.apache.struts.action.ActionMapping;

    importcom.sunsoft.struts.util.RSAUtil;

    /**
    *MyEclipseStruts
    *Creationdate:06-28-2008
    *
    *XDocletdefinition:
    *@struts.actionvalidate="true"
    */
    {
    /*
    *GeneratedMethods
    */

    /**
    *Methodexecute
    *@parammapping
    *@paramform
    *@paramrequest
    *@paramresponse
    *@returnActionForward
    */
    publicActionForwardexecute(ActionMappingmapping,ActionFormform,
    HttpServletRequestrequest,HttpServletResponseresponse)throwsException{

    RSAPublicKeyrsap=(RSAPublicKey)RSAUtil.getKeyPair().getPublic();
    Stringmole=rsap.getMolus().toString(16);
    Stringempoent=rsap.getPublicExponent().toString(16);
    System.out.println("mole");
    System.out.println(mole);
    System.out.println("empoent");
    System.out.println(empoent);
    request.setAttribute("m",mole);
    request.setAttribute("e",empoent);
    returnmapping.findForward("login");
    }
    }

    通过此action进入登录页面,并传入公钥的Molus 与PublicExponent的hex编码形式。

㈤ 怎么在ios进行rsa公钥加密,java做rsa私钥解密

1、用公钥加密,用私钥解密。
2、给别人发信息,就从服务器上拉下来别人的公钥,加密后发给他。
3、对方拿到信息后用自己的私钥解密。
4、这样,公钥加密后除了私钥持有人,别人都看不到信息。
5、若是用私钥加密,那么公钥都能解密,还有何安全性可言?
6、私钥加密的场合只有一个,那就是数字签名,用来表明这个信息来源于你。

㈥ java rsa私钥加密

java rsa私钥加密是什么?让我们一起来了解一下吧!

java rsa私钥加密是一种加密算法。私钥加密算法是用私钥来进行加密与解密信息。私钥加密也被称作对称加密,原因是加密与解密使用的秘钥是同一个。

RSA加密需要注意的事项如下:

1. 首先产生公钥与私钥

2. 设计加密与解密的算法

3. 私钥加密的数据信息只能由公钥可以解密

4. 公钥加密的数据信息只能由私钥可以解密

实战演练,具体步骤如下: public class RsaCryptTools {     private static final String CHARSET = "utf-8";     private static final Base64.Decoder decoder64 = Base64.getDecoder();     private static final Base64.Encoder encoder64 = Base64.getEncoder();       /**      * 生成公私钥      * @param keySize      * @return      * @throws NoSuchAlgorithmException      */     public static SecretKey generateSecretKey(int keySize) throws NoSuchAlgorithmException {         //生成密钥对         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");         keyGen.initialize(keySize, new SecureRandom());         KeyPair pair = keyGen.generateKeyPair();         PrivateKey privateKey = pair.getPrivate();         PublicKey publicKey = pair.getPublic();         //这里可以将密钥对保存到本地         return new SecretKey(encoder64.encodeToString(publicKey.getEncoded()), encoder64.encodeToString(privateKey.getEncoded()));     }     /**      * 私钥加密      * @param data      * @param privateInfoStr      * @return      * @throws IOException      * @throws InvalidCipherTextException      */     public static String encryptData(String data, String privateInfoStr) throws IOException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {           Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");         cipher.init(Cipher.ENCRYPT_MODE, getPrivateKey(privateInfoStr));         return encoder64.encodeToString(cipher.doFinal(data.getBytes(CHARSET)));     }       /**      * 公钥解密      * @param data      * @param publicInfoStr      * @return      */     public static String decryptData(String data, String publicInfoStr) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {         byte[] encryptDataBytes=decoder64.decode(data.getBytes(CHARSET));         //解密         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");         cipher.init(Cipher.DECRYPT_MODE, getPublicKey(publicInfoStr));         return new String(cipher.doFinal(encryptDataBytes), CHARSET);     }     private static PublicKey getPublicKey(String base64PublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(base64PublicKey.getBytes()));         KeyFactory keyFactory = KeyFactory.getInstance("RSA");         return keyFactory.generatePublic(keySpec);     }     private static PrivateKey getPrivateKey(String base64PrivateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {         PrivateKey privateKey = null;         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(base64PrivateKey.getBytes()));         KeyFactory keyFactory = null;         keyFactory = KeyFactory.getInstance("RSA");         privateKey = keyFactory.generatePrivate(keySpec);         return privateKey;     }       /**      * 密钥实体      * @author hank      * @since 2020/2/28 0028 下午 16:27      */     public static class SecretKey {         /**          * 公钥          */         private String publicKey;         /**          * 私钥          */         private String privateKey;           public SecretKey(String publicKey, String privateKey) {             this.publicKey = publicKey;             this.privateKey = privateKey;         }           public String getPublicKey() {             return publicKey;         }           public void setPublicKey(String publicKey) {             this.publicKey = publicKey;         }           public String getPrivateKey() {             return privateKey;         }           public void setPrivateKey(String privateKey) {             this.privateKey = privateKey;         }           @Override         public String toString() {             return "SecretKey{" +                     "publicKey='" + publicKey + '\'' +                     ", privateKey='" + privateKey + '\'' +                     '}';         }     }       private static void writeToFile(String path, byte[] key) throws IOException {         File f = new File(path);         f.getParentFile().mkdirs();           try(FileOutputStream fos = new FileOutputStream(f)) {             fos.write(key);             fos.flush();         }     }       public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, IOException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, InvalidKeySpecException {         SecretKey secretKey = generateSecretKey(2048);         System.out.println(secretKey);         String enStr = encryptData("你好测试测试", secretKey.getPrivateKey());         System.out.println(enStr);         String deStr = decryptData(enStr, secretKey.getPublicKey());         System.out.println(deStr);         enStr = encryptData("你好测试测试hello", secretKey.getPrivateKey());         System.out.println(enStr);         deStr = decryptData(enStr, secretKey.getPublicKey());         System.out.println(deStr);     }   }

㈦ 关于java中rsa的问题

【实例下载】本文介绍RSA2加密与解密,RSA2是RSA的加强版本,在密钥长度上采用2048, RSA2比RSA更安全,更可靠, 本人的另一篇文章RSA已经发表,有想了解的可以点开下面的RSA文章

㈧ javarsa加密c#解密失败

系统bug。当软件javarsa的系统出现系统bug时,就会导致该软件在解密c井的程序的时候出现解密失败的情况,只需要将该软件卸载后重新安装该软件即可。

㈨ java中的rsa\des算法的方法

rsa加密解密算法
1978年就出现了这种算法,它是第一个既能用于数据加密
也能用于数字签名的算法。它易于理解和操作,也很流行。算
法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和
Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。

RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数
( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文
推断出明文的难度等同于分解两个大素数的积。

密钥对的产生:选择两个大素数,p 和q 。计算:
n = p * q
然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 )
互质。最后,利用Euclid 算法计算解密密钥d, 满足

e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )

其中n和d也要互质。数e和
n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任
何人知道。 加密信息 m(二进制表示)时,首先把m分成等长数据
块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对
应的密文是:

ci = mi^e ( mod n ) ( a )

解密时作如下计算:

mi = ci^d ( mod n ) ( b )

RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )
式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先
作 HASH 运算。

RSA 的安全性。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理
论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在
一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,
RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显
然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,
模数n必须选大一些,因具体适用情况而定。

RSA的速度:
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论
是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据
加密。

RSA的选择密文攻击:
RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装
(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信
息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保
留了输入的乘法结构:

( XM )^d = X^d *M^d mod n

前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征
--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有
两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体
任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不
对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction
对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不
同类型的攻击方法。

RSA的公共模数攻击。
若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险
的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互
质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥
为e1和e2,公共模数是n,则:

C1 = P^e1 mod n

C2 = P^e2 mod n

密码分析者知道n、e1、e2、C1和C2,就能得到P。

因为e1和e2互质,故用Euclidean算法能找到r和s,满足:

r * e1 + s * e2 = 1

假设r为负数,需再用Euclidean算法计算C1^(-1),则

( C1^(-1) )^(-r) * C2^s = P mod n

另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数
的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它
成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享
模数n。

RSA的小指数攻击。 有一种提高
RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度
有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各
种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难
度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性
能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

RSA的缺点主要有:
A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次
一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits
以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;
且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。
目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长
的密钥,其他实体使用1024比特的密钥。
参考资料:http://superpch.josun.com.cn/bbs/PrintPost.asp?ThreadID=465
CRC加解密算法
http://www.bouncycastle.org/

热点内容
python打印机打印图片 发布:2025-01-24 14:59:49 浏览:227
javascript设计模式源码 发布:2025-01-24 14:49:07 浏览:908
linqtosql查询 发布:2025-01-24 14:48:57 浏览:120
华为手机更换开机密码如何操作 发布:2025-01-24 14:43:15 浏览:699
快手等待上传 发布:2025-01-24 14:41:37 浏览:380
apache和php7 发布:2025-01-24 14:32:26 浏览:892
linuxio文件 发布:2025-01-24 13:40:21 浏览:438
在excel设密码如何取消 发布:2025-01-24 13:38:54 浏览:483
电脑装存储时不能开机 发布:2025-01-24 13:38:52 浏览:285
2000人同时在线的小程序需要什么服务器 发布:2025-01-24 13:37:17 浏览:853