一、RSA加密算法的原理
    (1)、RSA算法描述
        RSA公钥密码体制的基本原理:根据数论,寻求两个大素数比较简单,而将他们的乘积分解开则极为困难。
(2)、RSA算法密钥计算过程:
1.用户秘密选取两个大素数 p q,计算n=pqn称为RSA算法的模数,公开。
2.计算出n的欧拉函数(n) = (p-1)×(q-1),保密。
3.从(1, (n))中随机地选择一个与(n)互素的数e作为加密密钥,公开。
4.计算出满足下式的 d 作为解密密钥,保密。
                  ed=1 mod (n)
(3)、RSA算法密钥:
          加密密钥PK = |e, n|        公开
          解密密钥SK = |d, n|        保密
(4)、RSA算法加密解密过程:
RSA算法属于分组密码,明文在加密前要进行分组,分组的值 m 要满足:0 < m < n
加密算法:C = E(m) ≡ me mod n
          解密算法:m = D(c) ≡ cd mod n
(5)、RSA算法的几点说明:
1.对于RSA算法,相同的明文映射出相同的密文。
2.RSA算法的密钥长度:是指模数n的长度,即n的二进制位数,而不是e或d的长度。
3.RSA的保密性基于大数进行因式分解很花时间,因此,进行RSA加密时,应选足够长的密钥。512bit已被证明不安全,1024bit也不保险。
4.RSA最快情况也比DES慢100倍,仅适合少量数据的加密。公钥e取较小值的方案不安全。
二.RSA公钥加密算法的编程实现
  以下程序是java编写的实现RSA加密及解密的算法
   
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 
import pto.Cipher; 
//RSATest类即为测试类
public class RSATest { 
//主函数
  public static void main(String[] args) { 
  try
  RSATest encrypt = new RSATest(); 
  String encryptText = "encryptText";//输入的明文  
  KeyPair keyPair = ateKey();//调用函数生成密钥对,函数见下 
  RSAPrivateKey privateKey = (RSAPrivateKey) Private(); 
  RSAPublicKey publicKey = (RSAPublicKey) Public();
  byte[] e = pt(publicKey, Bytes());
//调用自己编写的encrypt函数实现加密, 
  byte[] de = encrypt.decrypt(privateKey, e); 
//调用自己编写的decrypt函数实现解密, 
  System.out.println(toHexString(e)); //输出结果,采用ASSIC码形式 
  System.out.println(toHexString(de)); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
  } 
  // generateKey密钥对生成函数的实现
  public KeyPair generateKey() throws NoSuchAlgorithmException { 
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  //返回生成指定算法的 public/private 密钥对的 KeyPairGenerator 对象。 
  keyPairGen.initialize(1024, new SecureRandom());
//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。
  KeyPair keyPair = ateKeyPair();//生成一个密钥对 
  return keyPair; 
  }
// encrypt加密函数 
  protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) { 
      if (publicKey != null) { 
      try
      Cipher cipher = Cipher.getInstance("RSA");
//返回实现指定转换的 Cipher 对象。 
      cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//用密钥初始化此 Cipher,第一个参数表示加密 
      return cipher.doFinal(data); 
//按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
      } catch (Exception e) { 
      e.printStackTrace(); 
      } 
      } 
      return nulljava源代码加密; 
      }
//  decrypt解密函数
  protected byte[] decrypt(RSAPrivateKey privateKey, byte[] raw) { 
  if (privateKey != null) { 
  try
  Cipher cipher = Cipher.getInstance("RSA"); 
  cipher.init(Cipher.DECRYPT_MODE, privateKey); //第一个参数表示解密 
  return cipher.doFinal(raw); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
  } 
   
  return null
  } 
// toHexString将字节数组变为ASSIC码表示的字符串
  public static String toHexString(byte[] b) { 
  StringBuilder sb = new StringBuilder(b.length * 2);
//构造一个不带任何字符的字符串生成器,其初始容量由 capacity 参数指定。 
  for (int i = 0; i < b.length; i++) { 
  sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);
// append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。
//调用HEXCHAR方法 
  sb.append(HEXCHAR[b[i] & 0x0f]); 
  } 
  return sb.toString(); 
  } 
  //构建一个HEXCHAR数组 
  private static char[] HEXCHAR = { '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };   
}
小结:
        RSA公开密钥的加密算法实现方法如上所述,我们先是调用API生成了RSA的密钥对,然后调用API实现了加密与解密,最终通过编译的函数实现了字符数组的字符串输出,且输出的是字符串的ASSIC.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。