知识大全 java非对称加密的源代码(RSA)

Posted

篇首语:风流不在谈锋胜,袖手无言味最长。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java非对称加密的源代码(RSA)相关的知识,希望对你有一定的参考价值。

java非对称加密的源代码(RSA)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  鉴于rsa加密的重要性和相关源代码的匮乏 经过整理特此贴出 需要下载bcprov jdk jar     import javax crypto Cipher;  import java security *;  import java security spec RSAPublicKeySpec;  import java security spec RSAPrivateKeySpec;  import java security spec InvalidKeySpecException;  import java security interfaces RSAPrivateKey;  import java security interfaces RSAPublicKey;  import java io *;  import java math BigInteger;    /**  * RSA 工具类 提供加密 解密 生成密钥对等方法   * 需要到下载bcprov jdk jar   *  */  public class RSAUtil     /**  * 生成密钥对  * @return KeyPair  * @throws EncryptException  */  public static KeyPair generateKeyPair() throws EncryptException   try   KeyPairGenerator keyPairGen = KeyPairGenerator getInstance( RSA   new bouncycastle jce provider BouncyCastleProvider());  final int KEY_SIZE = ;//没什么好说的了 这个值关系到块加密的大小 可以更改 但是不要太大 否则效率会低  keyPairGen initialize(KEY_SIZE new SecureRandom());  KeyPair keyPair = keyPairGen genKeyPair();  return keyPair;   catch (Exception e)   throw new EncryptException(e getMessage());      /**  * 生成公钥  * @param modulus  * @param publicExponent  * @return RSAPublicKey  * @throws EncryptException  */  public static RSAPublicKey generateRSAPublicKey(byte[] modulus byte[] publicExponent) throws EncryptException   KeyFactory keyFac = null;  try   keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider());   catch (NoSuchAlgorithmException ex)   throw new EncryptException(ex getMessage());      RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus) new BigInteger(publicExponent));  try   return (RSAPublicKey) keyFac generatePublic(pubKeySpec);   catch (InvalidKeySpecException ex)   throw new EncryptException(ex getMessage());      /**  * 生成私钥  * @param modulus  * @param privateExponent  * @return RSAPrivateKey  * @throws EncryptException  */  public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus byte[] privateExponent) throws EncryptException   KeyFactory keyFac = null;  try   keyFac = KeyFactory getInstance( RSA new bouncycastle jce provider BouncyCastleProvider());   catch (NoSuchAlgorithmException ex)   throw new EncryptException(ex getMessage());      RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus) new BigInteger(privateExponent));  try   return (RSAPrivateKey) keyFac generatePrivate(priKeySpec);   catch (InvalidKeySpecException ex)   throw new EncryptException(ex getMessage());      /**  * 加密  * @param key 加密的密钥  * @param data 待加密的明文数据  * @return 加密后的数据  * @throws EncryptException  */  public static byte[] encrypt(Key key byte[] data) throws EncryptException   try   Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider());  cipher init(Cipher ENCRYPT_MODE key);  int blockSize = cipher getBlockSize();//获得加密块大小 如 加密前数据为 个byte 而key_size= 加密块大小为 byte 加密后为 个byte;因此共有 个加密块 第一个 byte第二个为 个byte  int outputSize = cipher getOutputSize(data length);//获得加密块加密后块大小  int leavedSize = data length % blockSize;  int blocksSize = leavedSize != ? data length / blockSize + : data length / blockSize;  byte[] raw = new byte[outputSize * blocksSize];  int i = ;  while (data length i * blockSize > )   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++;    return raw;   catch (Exception e)   throw new EncryptException(e getMessage());      /**  * 解密  * @param key 解密的密钥  * @param raw 已经加密的数据  * @return 解密后的明文  * @throws EncryptException  */  public static byte[] decrypt(Key key byte[] raw) throws EncryptException   try   Cipher cipher = Cipher getInstance( RSA new bouncycastle jce provider BouncyCastleProvider());  cipher init(cipher DECRYPT_MODE key);  int blockSize = cipher getBlockSize();  ByteArrayOutputStream bout = new ByteArrayOutputStream( );  int j = ;    while (raw length j * blockSize > )   bout write(cipher doFinal(raw j * blockSize blockSize));  j++;    return bout toByteArray();   catch (Exception e)   throw new EncryptException(e getMessage());      /**  *  * @param args  * @throws Exception  */  public static void main(String[] args) throws Exception   File file = new File( l );  FileInputStream in = new FileInputStream(file);  ByteArrayOutputStream bout = new ByteArrayOutputStream();  byte[] tmpbuf = new byte[ ];  int count = ;  while ((count = in read(tmpbuf)) != )   bout write(tmpbuf count);  tmpbuf = new byte[ ];    in close();  byte[] Data = bout toByteArray();  KeyPair keyPair = RSAUtil generateKeyPair();  RSAPublicKey pubKey = (RSAPublicKey) keyPair getPublic();  RSAPrivateKey priKey = (RSAPrivateKey) keyPair getPrivate();    byte[] pubModBytes = pubKey getModulus() toByteArray();  byte[] pubPubExpBytes = pubKey getPublicExponent() toByteArray();  byte[] priModBytes = priKey getModulus() toByteArray();  byte[] priPriExpBytes = priKey getPrivateExponent() toByteArray();  RSAPublicKey recoveryPubKey = RSAUtil generateRSAPublicKey(pubModBytes pubPubExpBytes);  RSAPrivateKey recoveryPriKey = RSAUtil generateRSAPrivateKey(priModBytes priPriExpBytes);    byte[] raw = RSAUtil encrypt(priKey Data);  file = new File( encrypt_result dat );  OutputStream out = new FileOutputStream(file);  out write(raw);  out close();  byte[] data = RSAUtil decrypt(recoveryPubKey raw);  file = new File( l );  out = new FileOutputStream(file);  out write(data);  out flush();  out close();        加密可以用公钥 解密用私钥 或者加密用私钥 通常非对称加密是非常消耗资源的 因此可以对大数据用对称加密如 des(具体代码可以看我以前发的贴子) 而对其对称密钥进行非对称加密 这样既保证了数据的安全 还能保证效率 cha138/Article/program/Java/gj/201311/27391

相关参考

知识大全 JAVA里面RSA加密算法的使用

JAVA里面RSA加密算法的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  打算写这个类用于

知识大全 用javascript与java进行RSA加密与解密

用javascript与java进行RSA加密与解密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Java中常用的加密算法MD5,SHA,RSA

Java中常用的加密算法MD5,SHA,RSA  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  M

知识大全 java与android之间的安全通讯

  实际上就是非对称密钥加密RSA  但为什么不使用jca这些java自带的呢?因为android是非sun的虚拟机其实现方法有不同在现实使用中老是报错而且网上几乎没有资料谈到这些所以干脆自己写纯ja

知识大全 使用DES对称加密代码,支持中文

使用DES对称加密代码,支持中文  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!//名称空间usin

知识大全 利用DES加密算法保护Java源代码

利用DES加密算法保护Java源代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java语言

知识大全 ASP.Net中如何实现RSA加密

ASP.Net中如何实现RSA加密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在我们实际运用

知识大全 漫谈Java加密技术(二)

漫谈Java加密技术(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  接下来我们介绍对称加密

知识大全 java密码加密与解密

  以下两个类可以很方便的完成字符串的加密和解密  加密CryptHelperencrypt(password)  解密CrypHelperdecrypt(password)  代码如下  Crypt

知识大全 RSA算法的实现——java版

RSA算法的实现——java版  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    package