JAva対称暗号化と非対称暗号化(PBE、DH、RSA)
8112 ワード
1.対称暗号化と非対称暗号化とは
対称暗号化:復号化方式は暗号化方式の逆演算であり、すなわち暗号化と復号化は同じ鍵(初等暗号化アルゴリズム)を用いる.
非対称暗号化:暗号化と復号化には2つの鍵が必要であり、この2つの鍵は公開鍵と秘密鍵(高等暗号化アルゴリズム)である.
2.対称式暗号化と非対称式暗号化の主な実現方式
対称暗号化の主な実現方法:
1)DES(Data Encryption Standard):セキュリティが悪く、一般的には推奨されません.
2)3 DES:三重DES、DES鍵長が短いという問題に対して、3 DESは最小112ビット、最高168ビットの鍵長を実現できる.
3)AES:3 DESより安全性が高い.
4)PBE(Password Based Encryption):パスワードの暗号化に基づいて、DESとAESの利点を組み合わせた.
非対称暗号化の主な実現方法:
1)DH(Diffie-Hellman):鍵交換アルゴリズム.
2)RSA:因子分解に基づく.
3)ElGamal:離散対数に基づく.
4)ECC(Elliptical Curve Cryptography):楕円曲線暗号化.
3.対称暗号化と非対称暗号化の対比
非対称暗号化は対称暗号化に比べて安全性が高い:対称暗号化の通信双方は同じ鍵を使用し、一方の鍵が漏洩されると、通信全体が解読される.対称暗号化ではなく、一対の鍵を使用し、1つは暗号化に使用され、1つは復号化に使用され、公開鍵は公開され、鍵は自分で保存され、対称暗号化のように通信する前に鍵を同期する必要はありません.4.Javaにおける対称暗号化の実装(PBE暗号化):
5.JAVAにおける非対称暗号化の実現(DH暗号化):
6.JAVAにおける非対称暗号化の実現(RSA暗号化):
対称暗号化:復号化方式は暗号化方式の逆演算であり、すなわち暗号化と復号化は同じ鍵(初等暗号化アルゴリズム)を用いる.
非対称暗号化:暗号化と復号化には2つの鍵が必要であり、この2つの鍵は公開鍵と秘密鍵(高等暗号化アルゴリズム)である.
2.対称式暗号化と非対称式暗号化の主な実現方式
対称暗号化の主な実現方法:
1)DES(Data Encryption Standard):セキュリティが悪く、一般的には推奨されません.
2)3 DES:三重DES、DES鍵長が短いという問題に対して、3 DESは最小112ビット、最高168ビットの鍵長を実現できる.
3)AES:3 DESより安全性が高い.
4)PBE(Password Based Encryption):パスワードの暗号化に基づいて、DESとAESの利点を組み合わせた.
非対称暗号化の主な実現方法:
1)DH(Diffie-Hellman):鍵交換アルゴリズム.
2)RSA:因子分解に基づく.
3)ElGamal:離散対数に基づく.
4)ECC(Elliptical Curve Cryptography):楕円曲線暗号化.
3.対称暗号化と非対称暗号化の対比
非対称暗号化は対称暗号化に比べて安全性が高い:対称暗号化の通信双方は同じ鍵を使用し、一方の鍵が漏洩されると、通信全体が解読される.対称暗号化ではなく、一対の鍵を使用し、1つは暗号化に使用され、1つは復号化に使用され、公開鍵は公開され、鍵は自分で保存され、対称暗号化のように通信する前に鍵を同期する必要はありません.4.Javaにおける対称暗号化の実装(PBE暗号化):
public class PBE {
private static Stringsrc="security with PBE";
public static void main(String[]args){
jdkPBE();
}
public static void jdkPBE(){
try {
// ( )
SecureRandom random=newSecureRandom();
byte[]salt=random.generateSeed(8);
//
Stringpassword="CSDN";
PBEKeySpecpbeKeySpec=new PBEKeySpec(password.toCharArray());
SecretKeyFactoryfactory=SecretKeyFactory.getInstance("PBEWITHMD5andEDS");
Keykey=factory.generateSecret(pbeKeySpec);
//
PBEParameterSpecpbeParameterSpec=new PBEParameterSpec(salt,100);// 1. , 2.
Cipher cipher=Cipher.getInstance("PBEWITHMD5andEDS");
cipher.init(Cipher.ENCRYPT_MODE,key,pbeParameterSpec);
byte[]result=cipher.doFinal(src.getBytes());
System.out.println("jdk pbe encrypt:" +Base64.encodeToString(result,1));
//
cipher.init(Cipher.DECRYPT_MODE,key,pbeParameterSpec);
result=cipher.doFinal(result);
System.out.println("jdk pbe decrypt:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
5.JAVAにおける非対称暗号化の実現(DH暗号化):
public class DH {
private static Stringsrc="security with DH";
public static void main(String[]args){
jdkDH();
}
public static void jdkDH(){
try {
//
KeyPairGeneratorsenderKeyPairGenerator=KeyPairGenerator.getInstance("DH");
senderKeyPairGenerator.initialize(512);
KeyPairsenderKeyPair=senderKeyPairGenerator.generateKeyPair();
byte[]senderPublicKeyEnc=senderKeyPair.getPublic().getEncoded();
//
KeyFactoryreceiverKeyFactory=KeyFactory.getInstance("DH");
X509EncodedKeySpecx509EncodedKeySpec=new X509EncodedKeySpec(senderPublicKeyEnc);
PublicKeyreceiverPublicKey=receiverKeyFactory.generatePublic(x509EncodedKeySpec);
DHParameterSpecdhParameterSpec=((DHPublicKey)receiverPublicKey).getParams();
KeyPairGeneratorreceiverKeyPairGenerator=KeyPairGenerator.getInstance("DH");
receiverKeyPairGenerator.initialize(dhParameterSpec);
KeyPairreceiverKeyPair=receiverKeyPairGenerator.generateKeyPair();
PrivateKeyreceiverPrivateKey=receiverKeyPair.getPrivate();
byte[]receiverPublicKeyEnc =receiverKeyPair.getPublic().getEncoded();
//
KeyAgreementreceiverKeyAgreement = KeyAgreement.getInstance("DH");
receiverKeyAgreement.init(receiverPrivateKey);
receiverKeyAgreement.doPhase(receiverPublicKey,true);
SecretKeyreceiverDesKey=receiverKeyAgreement.generateSecret("DES");
KeyFactorysenderKeyFactory=KeyFactory.getInstance("DH");
x509EncodedKeySpec=newX509EncodedKeySpec(receiverPublicKeyEnc);
PublicKeysenderPublicKey=senderKeyFactory.generatePublic(x509EncodedKeySpec);
KeyAgreementsenderKeyAgreement=KeyAgreement.getInstance("DH");
senderKeyAgreement.init(senderKeyPair.getPrivate());
senderKeyAgreement.doPhase(senderPublicKey, true);
SecretKeysenderDesKey=senderKeyAgreement.generateSecret("DES");
if(Objects.equals(receiverDesKey,senderDesKey)){
System.out.println(" ");
}
//
Ciphercipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE,senderDesKey);
byte[]result=cipher.doFinal(src.getBytes());
System.out.println("jdk dhencrypt:"+Base64.encodeToString(result,1));
//
cipher=Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE,receiverDesKey);
result=cipher.doFinal(result);
System.out.println("jdk dhencrypt:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.JAVAにおける非対称暗号化の実現(RSA暗号化):
public class RSA {
private static Stringsrc="security with rsa";
public static void main(String[]args){
jdkRSA();
}
public static void jdkRSA(){
try {
//
KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);//64 ,512~65536
KeyPairkeyPair=keyPairGenerator.generateKeyPair();
RSAPrivateKeyrsaPrivateKey= (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKeyrsaPublicKey= (RSAPublicKey) keyPair.getPublic();
System.out.println("Public key:"+Base64.encodeToString(rsaPrivateKey.getEncoded(),1));
System.out.println("Private key:"+ Base64.encodeToString(rsaPrivateKey.getEncoded(),1));
// , ——
PKCS8EncodedKeySpecpkcs8EncodedKeySpec=new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactorykeyFactory=KeyFactory.getInstance("RSA");
PrivateKeyprivateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Ciphercipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[]result=cipher.doFinal(src.getBytes());
System.out.println(" , —— :"+Base64.encodeToString(result,1));
// , ——
X509EncodedKeySpecx509EncodedKeySpec=new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
PublicKeypublicKey=keyFactory.generatePublic(x509EncodedKeySpec);
cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,publicKey);
result=cipher.doFinal(result);
System.out.println(newString(result));
// , ——
x509EncodedKeySpec=newX509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
publicKey=keyFactory.generatePublic(x509EncodedKeySpec);
cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
result=cipher.doFinal(src.getBytes());
System.out.println(" , —— :"+Base64.encodeToString(result,1));
// , ——
pkcs8EncodedKeySpec=newPKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory=KeyFactory.getInstance("RSA");
privateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
cipher.doFinal(result);
System.out.println(" , —— :" + Base64.encodeToString(result, 1));
} catch (Exception e) {
e.printStackTrace();
}
}
}