RSA鍵ペア
最近のプロジェクトは、私たちがRSA非対称暗号化を使用して、データ伝送の暗号化と復号化するための要件を持っているので、ここではそれを記録します。
何で最初のRSA暗号化アルゴリズムそれ(コピー)を導入し、
RSA暗号化アルゴリズムがあり、非対称暗号化アルゴリズム。では、公開鍵暗号化と電子商取引 RSAで広く使用されています。よるRSA 1977 ロナルド・リベスト(ロナルド・リベスト)、アディ・シャミア(アディ・シャミア)とレオナルド・エーデルマン(レオナルド・エーデルマンは)一緒に発表しました。その時にそれらの3つがにあるMITの仕事。RSAは、一緒に作品を作曲文字で始まる姓三人です。
では、公開鍵暗号、(公開鍵)で暗号化キーPKは、公開情報であり、復号鍵(つまり、秘密鍵)は、SKが機密です。暗号化アルゴリズム Eと復号アルゴリズムDも開示されています。SKは、公開鍵PKによって決定され、そしてnオイラー関数PHI(N)、それはPK SKに基づいて計算することができないので、大きな数字が計算できない復号鍵があるが
、この理論に基づいており、1978年に有名なのがありましたRSAアルゴリズムは、それは通常、RSA鍵のペアに氏が、ユーザーによって保存された秘密鍵となっている一つであり、他には公開鍵がさえに、公表されることが可能であるネットワーク・サーバの登録。機密性の強さ、少なくとも500のRSA鍵長、一般1024推奨を改善するために。これは、計算の暗号化を大量にできます。計算量を削減するために、情報は多くの場合、従来の暗号化方法と使用して、転送された公開鍵を暗号化方式の組合せ、改良された暗号化またはDESのIDEAキー、すなわち、情報及び鍵RSA鍵暗号化とメッセージダイジェストセッションを使用します。異なる鍵を用いて、情報の他の側面を受信した後に復号化し、メッセージダイジェストを確認します。RSAアルゴリズムは、まず、暗号化との両方のために使用することができるデジタル署名も容易に理解し、操作するために、アルゴリズム。RSAは、最も広く研究されているの公開鍵、アルゴリズム今日から30年に提示、2017のように、広く国民の最適なプログラムとみなされ、徐々に受け入れられ、様々な攻撃の試練に耐えてきましたA。します。https://www.jianshu.com/p/d614ba4720ec
以下は、データの暗号化と復号化です
public class RSAGenerator{
public static void main(String[] args) throws Exception {
String data = "abc";
KeyPair keyPair = generateRSAKeyPair(DEFAULT_KEY_SIZE);
PublicKey aPublic = keyPair.getPublic(); // 公钥
PrivateKey aPrivate = keyPair.getPrivate(); // 私钥
String strPriKey = new String(Base64.getEncoder().encode(aPrivate.getEncoded()));
String strPubKey = new String(Base64.getEncoder().encode(aPublic.getEncoded()));
System.out.println(strPubKey);
System.out.println("-------------");
System.out.println(strPriKey);
System.out.println("--------------");
System.out.println("加密如下");
System.out.println("vvvvvvvvvvvv");
byte[] encrypt = encrypt(data.getBytes(), aPublic);
System.out.println(new String(encrypt));
System.out.println("解密如下");
System.out.println("vvvvvvvvvvvv");
byte[] bytes1 = decrypt(encrypt, aPrivate);
System.out.println(new String(bytes1));
}
public static final String RSA = "RSA";// 非对称加密密钥算法
public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//加密填充方式
public static final int DEFAULT_KEY_SIZE = 1024;//秘钥默认长度
public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes(); // 当要加密的内容超过bufferSize,则采用partSplit进行分块加密
public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数
public static KeyPair generateRSAKeyPair(int keyLength) {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
kpg.initialize(keyLength);
return kpg.genKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
//公钥加密
public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{
Cipher cipher=Cipher.getInstance(ECB_PKCS1_PADDING);//java默认"RSA"="RSA/ECB/PKCS1Padding"
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(content);
}
//私钥解密
public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{
Cipher cipher=Cipher.getInstance(ECB_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(content);
}
}