RSAアルゴリズムの概要:
RSAアルゴリズムは、非対称暗号化アルゴリズムであるRSA暗号化アルゴリズムです。RSAは、公開鍵暗号化と電子商取引で広く使用されています。よるRSA 1977 ロナルド・リベスト(ロナルド・リベスト)、アディ・シャミア(アディ・シャミア)とレオナルド・エーデルマン(レオナルド・エーデルマンは)一緒に発表しました。RSAは3人の手紙で構成されています。1973年、イギリス政府の通信本部で働いている数学者のクリフォードコックスは、内部文書で同じアルゴリズムを提案しましたが、彼の調査結果は1997年まで秘密にされていました公開。RSAは現在、非常に影響力のある公開鍵暗号化アルゴリズムです。既知の暗号攻撃のほとんどに抵抗できます。公開鍵データ暗号化規格としてISOによって推奨されています。2008年現在、RSAアルゴリズムを攻撃する信頼できる方法は世界中にありません。キーの長さが十分である限り、RSAで暗号化された情報は実際には破壊されません。
スピード:
すべての計算は数値が大きいため、ソフトウェアまたはハードウェアのどちらで実装されていても、最速のRSA状況はDESより数倍遅くなります。速度は常にRSAの欠点でした。一般に、少量のデータ暗号化にのみ使用されます。RSAの速度は、同じセキュリティレベルに対応する対称暗号化アルゴリズムよりも約1000倍遅くなります。
セキュリティ:
RSAのセキュリティは多数の分解に依存しますが、RSAの分解に多数の分解が必要であるという証拠がないため、それが多数の分解と同等であるかどうかは理論的に証明されていません。大きな数を分解する必要のないアルゴリズムがあるとすると、それは確かに大きな数の分解アルゴリズムに変更できます。RSAの一部のバリアントは、多数の分解と同等であることが証明されています。いずれにせよ、nの因数分解は最も明白な攻撃方法です。人々は、小数点以下が複数ある大きな素数を解決することができました。したがって、特定のアプリケーションに応じて、係数nを大きく選択する必要があります。
------上記のコンテンツはそごう百科事典から取得されました
コードの実装:
パッケージcom.huadian.encrytionanddecrytion; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Scanner; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; |
public class RSA { / ** *加密 * * @param content *要加密的内容 * @param password *加密密密 * @return * / public static byte [] encrypt(String content、String password){ try { KeyGenerator kgen = KeyGenerator.getInstance( "AES"); kgen.init(128、new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte [] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat、 "AES"); Cipher cipher = Cipher.getInstance( "AES"); //创建密码器 e.printStackTrace(); byte [] byteContent = content.getBytes( "utf-8"); cipher.init(Cipher.ENCRYPT_MODE、key); //初始化 byte []結果= cipher.doFinal(byteContent); 結果を返す; //加密 }キャッチ(NoSuchAlgorithmException e){ e.printStackTrace(); } catch(NoSuchPaddingException e){ e.printStackTrace(); } catch(InvalidKeyException e){ e.printStackTrace(); } catch(UnsupportedEncodingException e){ e.printStackTrace(); } catch(BadPaddingException e){ } catch(IllegalBlockSizeException e){ e.printStackTrace(); } nullを返します。 } |
/** * 解密 * * @param content * 待解密内容 * @param password * 解密密钥 * @return */ public static byte[] decrypt(byte[] content, String password) { try { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(content); return result; // 加密 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } |
/** * 将二进制转换成16进制 * * @param buf * @return */ public static String parseByte2HexStr(byte buf[]) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } |
/** * 将16进制转换为二进制 * * @param hexStr * @return */ public static byte[] parseHexStr2Byte(String hexStr) { if (hexStr.length() < 1) return null; byte[] result = new byte[hexStr.length() / 2]; for (int i = 0; i < hexStr.length() / 2; i++) { int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16); int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16); result[i] = (byte) (high * 16 + low); } return result; } |
/** * 加密 * * @param content * 需要加密的内容 * @param password * 加密密码 * @return */ public static byte[] encrypt2(String content, String password) { try { SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); byte[] byteContent = content.getBytes("utf-8"); cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(byteContent); return result; // 加密 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } |
public static void main(String[] args) throws UnsupportedEncodingException { System.out.println("请输入要加密的内容和密码"); System.out.println("请输入要加密的密码"); Scanner scanner = new Scanner(System.in); String content = scanner.next(); String password = scanner.next(); // String content = "我是shoneworn"; // String password = "12345678"; // 加密 System.out.println("加密前:" + content); byte[] encode = encrypt(content, password); //传输过程,不转成16进制的字符串,就等着程序崩溃掉吧 String code = parseByte2HexStr(encode); System.out.println("密文字符串:" + code); byte[] decode = parseHexStr2Byte(code); // 解密 byte[] decryptResult = decrypt(decode, password); System.out.println("解密后:" + new String(decryptResult, "UTF-8")); //不转码会乱码 } } |