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

Posted 长度

篇首语:休言女子非英物,夜夜龙泉壁上鸣。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA里面RSA加密算法的使用相关的知识,希望对你有一定的参考价值。

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

  打算写这个类用于spark插件加密对话消息用

  RSA的Java实现不能一次加密很大的字符 自己处理了一下 见下面的代码

  Base 编码类用的是一个Public domain Base for java

  其他的保存公钥到文件等简单的实现 就不详细说了 看代码吧

  ==============================================

  import java security *;

  import java security spec PKCS EncodedKeySpec;

  import java security spec X EncodedKeySpec;

  import java util HashMap;

  import java util Map;

  import javax crypto *;

  import java io *;

  public class Encryptor

  private static final String KEY_FILENAME = c:\\\\mykey dat ;

  private static final String OTHERS_KEY_FILENAME = c:\\\\Otherskey dat ;

  // private static final int KEY_SIZE = ;

  // private static final int BLOCK_SIZE = ;

  // private static final int OUTPUT_BLOCK_SIZE = ;

  private static final int KEY_SIZE = ; //RSA key 是多少位的

  private static final int BLOCK_SIZE = ;    //一次RSA加密操作所允许的最大长度

  //这个值与 KEY_SIZE 已经padding方法有关 因为 的key的输出是 key输出是 字节

  //可能 个字节用于保存padding信息了 所以最多可用的就只有 字节了

  private static final int OUTPUT_BLOCK_SIZE = ;

  private SecureRandom secrand;

  private Cipher rsaCipher;

  private KeyPair keys;

  private Map<String Key> allUserKeys;

  public Encryptor() throws Exception

  try

  allUserKeys = new HashMap<String Key>();

  secrand = new SecureRandom();

  //SunJCE Provider 中只支持ECB mode 试了一下只有PKCS PADDING可以直接还原原始数据

  //NOPadding导致解压出来的都是blocksize长度的数据 还要自己处理

  //参见 l

  //

  //另外根据 Open JDK b src(l)

  // 中代码的注释 使用RSA来加密大量数据不是一种标准的用法 所以现有实现一次doFinal调用之进行一个RSA操作

  //如果用doFinal来加密超过的一个操作所允许的长度数据将抛出异常

  //根据keysize的长度 典型的 个长度的key和PKCS PADDING一起使用时

  //一次doFinal调用只能加密 个byte的数据 (NOPadding 和 keysize时 个字节长度)

  //( 长度的key和PKCS PADDING 最多允许 字节一次)

  //想用来加密大量数据的只能自己用其他办法实现了 可能RSA加密速度比较慢吧 要用AES才行

  rsaCipher = Cipher getInstance( RSA/ECB/PKCS PADDING );

   catch (NoSuchAlgorithmException e)

  e printStackTrace();

   catch (NoSuchPaddingException e)

  e printStackTrace();

  throw e;

  

  ObjectInputStream in;

  try

  in = new ObjectInputStream(new FileInputStream(KEY_FILENAME));

   catch (FileNotFoundException e)

  if (false == GenerateKeys())

  

  throw e;

  

  LoadKeys();

  return;

  

  keys = (KeyPair) in readObject();

  in close();

  LoadKeys();

  

  /*

  * 生成自己的公钥和私钥

  */

  private Boolean GenerateKeys()

  try

  KeyPairGenerator keygen = KeyPairGenerator getInstance( RSA );

  // secrand = new SecureRandom();

  // sedSeed之后会造成 生成的密钥都是一样的

  // secrand setSeed( chatencrptor getBytes()); // 初始化随机产生器

  //key长度至少 长度 不过好像说现在用 才算比较安全的了

  keygen initialize(KEY_SIZE secrand); // 初始化密钥生成器

  keys = keygen generateKeyPair(); // 生成密钥组

  AddKey( me EncodeKey(keys getPublic()));

   catch (NoSuchAlgorithmException e)

  e printStackTrace();

  return false;

  

  ObjectOutputStream out;

  try

  out = new ObjectOutputStream(new FileOutputStream(KEY_FILENAME));

   catch (IOException e)

  e printStackTrace();

  return false;

  

  try

  out writeObject(keys);

   catch (IOException e)

  e printStackTrace();

  return false;

   finally

  try

  out close();

   catch (IOException e)

  e printStackTrace();

  return false;

  

  

  return true;

  

  public String EncryptMessage(String toUser String Message) throws IOException

  Key pubkey = allUserKeys get(toUser);

  if ( pubkey == null )

  

  throw new IOException( NoKeyForThisUser ) ;

  

  try

  //PublicKey pubkey = keys getPublic();

  rsaCipher init(Cipher ENCRYPT_MODE pubkey secrand);

  //System out println(rsaCipher getBlockSize()); 返回 非block 加密算法来的?

  //System out println(Message getBytes( utf ) length);

  //byte[] encryptedData = rsaCipher doFinal(Message getBytes( utf ));

  byte[] data = Message getBytes( utf );

  int blocks = data length / BLOCK_SIZE ;

  int lastBlockSize = data length % BLOCK_SIZE ;

  byte [] encryptedData = new byte[ (lastBlockSize == ? blocks : blocks + )* OUTPUT_BLOCK_SIZE];

  for (int i= ; i < blocks; i++)

  

  //int thisBlockSize = ( i + ) * BLOCK_SIZE > data length ? data length i * BLOCK_SIZE : BLOCK_SIZE ;

  rsaCipher doFinal(data i * BLOCK_SIZE BLOCK_SIZE encryptedData i * OUTPUT_BLOCK_SIZE);

  

  if (lastBlockSize != )

  rsaCipher doFinal(data blocks * BLOCK_SIZE lastBlockSize encryptedData blocks * OUTPUT_BLOCK_SIZE);

  

  //System out println(encrypted length); 如果要机密的数据不足 / 字节 加密后补全成为变为 长度的

  //数量比较小时 Base GZIP产生的长度更长 没什么优势

  //System out println(Base encodeBytes(encrypted Base GZIP) length());

  //System out println(Base encodeBytes(encrypted) length());

  //System out println (rsaCipher getOutputSize( ));

  //这个getOutputSize 只对 输入小于最大的block时才能得到正确的结果 其实就是补全 数据为 / 字节

  return Base encodeBytes(encryptedData);

   catch (InvalidKeyException e)

  e printStackTrace();

  throw new IOException( InvalidKey ) ;

  catch (ShortBufferException e)

  e printStackTrace();

  throw new IOException( ShortBuffer ) ;

  

  catch (UnsupportedEncodingException e)

  e printStackTrace();

  throw new IOException( UnsupportedEncoding ) ;

   catch (IllegalBlockSizeException e)

  e printStackTrace();

  throw new IOException( IllegalBlockSize ) ;

   catch (BadPaddingException e)

  e printStackTrace();

  throw new IOException( BadPadding ) ;

  finally

  //catch 中 return 或者throw之前都会先调用一下这里

  

  

  public String DecryptMessage(String Message) throws IOException

  byte[] decoded = Base decode(Message);

  PrivateKey prikey = keys getPrivate();

  try

  rsaCipher init(Cipher DECRYPT_MODE prikey secrand);

  int blocks = decoded length / OUTPUT_BLOCK_SIZE;

  ByteArrayOutputStream decodedStream = new ByteArrayOutputStream(decoded length);

  for (int i = ;i < blocks ; i ++ )

  

  decodedStream write (rsaCipher doFinal(decoded i * OUTPUT_BLOCK_SIZE OUTPUT_BLOCK_SIZE));

  

  return new String(decodedStream toByteArray() UTF );

   catch (InvalidKeyException e)

  e printStackTrace();

  throw new IOException( InvalidKey );

   catch (UnsupportedEncodingException e)

  e printStackTrace();

  throw new IOException( UnsupportedEncoding );

   catch (IllegalBlockSizeException e)

  e printStackTrace();

  throw new IOException( IllegalBlockSize );

   catch (BadPaddingException e)

  e printStackTrace();

  throw new IOException( BadPadding );

   finally

  // catch 中 return 或者throw之前都会先调用一下这里

  

  

  public boolean AddKey(String user String key)

  PublicKey publickey;

  try

  publickey = DecodePublicKey(key);

   catch (Exception e)

  return false;

  

  allUserKeys put(user publickey);

  SaveKeys();

  return true;

  

  private boolean LoadKeys()

  BufferedReader input;

  try

  input = new BufferedReader(new InputStreamReader(

  new FileInputStream(OTHERS_KEY_FILENAME)));

   catch (FileNotFoundException e )

  // e printStackTrace();

  return false;

  

  try

  allUserKeys clear();

  String line;

  while ((line = input readLine()) != null)

  String[] temp = line split( \\\\| );

  String user = temp[ ];

  PublicKey key = DecodePublicKey(temp[ ]);

  allUserKeys put(user key);

  

   catch (Exception e)

  return false;

   finally

  try

  input close();

   catch (Exception e)

  return false;

  

  

  return true;

  

  private boolean SaveKeys()

  FileWriter output;

  try

  output = new FileWriter(OTHERS_KEY_FILENAME);

   catch (IOException e )

  // printStackTrace();

  return false;

  

  try

  for (String user : allUserKeys keySet())

  Key key = allUserKeys get(user);

  output write(user + | + EncodeKey(key) + \\n );

  

   catch (IOException e )

  // printStackTrace();

  return false;

   finally

  try

  output close();

   catch (Exception e)

  return false;

  

  

  return true;

  

  /**

  * 解密base 编码得到公钥

  *

  * @param key

  *            密钥字符串(经过base 编码)

  * @throws Exception

  */

  public static PublicKey DecodePublicKey(String key) throws Exception

  byte[] keyBytes;

  keyBytes = Base decode(key);

  X EncodedKeySpec keySpec = new X EncodedKeySpec(keyBytes);

  KeyFactory keyFactory = KeyFactory getInstance( RSA );

  PublicKey publicKey = keyFactory generatePublic(keySpec);

  return publicKey;

  

  /**

  * 解密base 编码得到私钥

  *

  * @param key

  *            密钥字符串(经过base 编码)

  * @throws Exception

  */

  public static PrivateKey DecodePrivateKey(String key) throws Exception

  byte[] keyBytes;

  keyBytes = Base decode(key);

  PKCS EncodedKeySpec keySpec = new PKCS EncodedKeySpec(keyBytes);

  KeyFactory keyFactory = KeyFactory getInstance( RSA );

  PrivateKey privateKey = keyFactory generatePrivate(keySpec);

  return privateKey;

  

  /**

  * 编码key为base 字符串

  *

  * @return

  */

  public static String EncodeKey(Key key)

  byte[] keyBytes = key getEncoded();

  // System out print(key getFormat()) ;

  String s = Base encodeBytes(keyBytes);

  return s;

  

  

  ===============测试类============================

  import java util Iterator ;

  import java security Security ;

  import java security Provider ;

  public class Test

  /**

  * @param args

  */

  public static void main(String[] args)

  //   Provider [ ] providers = Security getProviders () ;

  //   for ( int i = ; i < providers length ; i++ )

  //  

  //   String name = providers[i] getName () ;

  //   String info = providers[i] getInfo () ;

  //   double version = providers[i] getVersion () ;

  //   System out println ( ) ;

  //   System out println ( name: + name ) ;

  //   System out println ( info: + info ) ;

  //   System out println ( version: + version ) ;

  //

  //   for ( Iterator iter = providers[i] keySet(erator () ; iter hasNext () ; )

  //  

  //   String key = (String) iter next () ;

  //   System out println ( \\t + key +

  //   \\t +

  //   providers[i] getProperty ( key ) ) ;

  //  

  //

  //   System out println (

  //

  //   );

  //  

  //

  //   int i = / ;

  //   System out println(i);

  //   i = / ;

  //   System out println(i);

  //   i = / ;

  //   System out println(i);

  //   i = / ;

  //   System out println(i);

  //String str = widebriht的测试 哈哈^_^ ;

  //String str = MIIBIjANBgkqiG w BAQEFAAOCAQ AMIIBCgKCAQEA dYTv xxgsu SmgqJzPWzSOziMDnOV+tAxQGumNAJKcBxOlD hQlqTGRnUoqIp z brioFJBtMs wAeA+pfpJhFyqodI frr I Y PUgwRlL ozGA hu CBOADQNKE g UgOTQ/joE YoYPCHKx/vYQncOe axOCqcXBWViw WgPr g qj CarQLM e dUNMCYcX ZGvqIy Js FjuLsNaK k y fjIqqu FzhjvIEDCtrMNyTvV coV rDGTEC KfJft oeCTXrhcgzMBdaG DXFQezQIepMdPAT+kga/qJ b I LMwyCDhwPmH UNQAmdMpJ bZTTwIDAQAB ;

  String str = MIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w BMIIBIjANBgkqiG w Bddddd ;

  try

  Encryptor ddd = new Encryptor();

  str = ddd EncryptMessage( me str);

  // System out println(str length());

  String str = jhahahh my god ;

  str = ddd EncryptMessage( me str );

  str = ddd DecryptMessage(str );

  str = ddd DecryptMessage(str);

   catch (Exception e)

  if (e getMessage() == NoKeyForThisUser )

  System out println( NoKeyForThisUser );

  

  

  // str = ddd DecryptMessage(

  // inI y PfFXt oNWXuYLBbTkIaaxZFzgWuMfYTqpT b UUQN T iK l XnS+WShC/ZGL noX vO sDmiJ+z I /WTgvOOW XE+G +edGzh bfRGPxhG MJpl y/FsIErsKgZmybERE F IP /b xGmrZhyj /NwZln qUg= );

  //System out println(str);

  

cha138/Article/program/Java/hx/201311/25887

相关参考

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

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

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

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

知识大全 Java生成RSA非对称型加密的公钥和私钥

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

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

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

知识大全 java中使用MD5加密算法进行加密

java中使用MD5加密算法进行加密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在各种应用系

知识大全 Java技术进阶 基于Java的IDEA加密算法探讨

Java技术进阶基于Java的IDEA加密算法探讨  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 JAVA版MD5加密算法

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

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

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

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

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

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

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