非对称加密算法的使用
1. JAVA中的使用
1.1.原生使用
package asymmetric_encryption;
import java.security.*;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
public class RSAExample {
public static void RSADemo() throws Exception {
// Generate a key pair
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048, new SecureRandom());
KeyPair keyPair = keyPairGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 输出公钥和私钥
System.out.println("publicKey: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
System.out.println("privateKey: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
// Encrypt the message
String message = "Hello, World!";
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedMessage = cipher.doFinal(message.getBytes());
System.out.println("Encrypted Message: " + bytesToHex(encryptedMessage));
// Decrypt the message
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage = cipher.doFinal(encryptedMessage);
System.out.println("Decrypted Message: " + new String(decryptedMessage));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
package asymmetric_encryption;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPrivateKeySpec;
import org.bouncycastle.jce.spec.ECPublicKeySpec;
import org.bouncycastle.math.ec.ECPoint;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Base64;
public class ECCExample {
public static void ECCDemo() throws Exception {
Security.addProvider(new BouncyCastleProvider());
// 生成 ECC 密钥对
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("ECDSA");
keyPairGen.initialize(256); // 使用 256 位的曲线
KeyPair keyPair = keyPairGen.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
System.out.println("ECC 公钥: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
System.out.println("ECC 私钥: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
// 签名
Signature signature = Signature.getInstance("SHA256withECDSA");
signature.initSign(privateKey);
String message = "Hello, World!";
signature.update(message.getBytes());
byte[] signatureBytes = signature.sign();
System.out.println("签名: " + Base64.getEncoder().encodeToString(signatureBytes));
}
}
package asymmetric_encryption;
import javax.crypto.KeyAgreement;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.DHPublicKeySpec;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
public class DiffieHellmanExample {
public static void DiffieHellmanDemo() throws Exception {
// 生成 Diffie-Hellman 密钥对
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DH");
keyPairGen.initialize(2048);
KeyPair keyPairA = keyPairGen.generateKeyPair();
KeyPair keyPairB = keyPairGen.generateKeyPair();
// 获取公钥和私钥
PublicKey publicKeyA = keyPairA.getPublic();
PrivateKey privateKeyA = keyPairA.getPrivate();
PublicKey publicKeyB = keyPairB.getPublic();
PrivateKey privateKeyB = keyPairB.getPrivate();
// 进行密钥交换
KeyAgreement keyAgreementA = KeyAgreement.getInstance("DH");
keyAgreementA.init(privateKeyA);
keyAgreementA.doPhase(publicKeyB, true);
byte[] secretA = keyAgreementA.generateSecret();
KeyAgreement keyAgreementB = KeyAgreement.getInstance("DH");
keyAgreementB.init(privateKeyB);
keyAgreementB.doPhase(publicKeyA, true);
byte[] secretB = keyAgreementB.generateSecret();
System.out.println("A 生成的共享密钥: " + bytesToHex(secretA));
System.out.println("B 生成的共享密钥: " + bytesToHex(secretB));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr61PJJoDjoPp6naH64hTuEqa3hgY+7tcdadPye1GbhQpSAyyeKzkLDxrUreuR8DImjutY+d9rNDLdFJVN074hoAJMzYKUR2zTBrwcdmY0uij3IHe3XzV7tQdVZTHWjCLWYXqouYKkIIm8Dw52XbCSPbPNMuL1/7W1weitTLCZX239caI1blOYagklTPGAj40Gb5aWUdxuwCRwzqgAwR7LM+Oee7GwEs7vSb0cEc9b3uRZjKm7sIfIbBAbSeEer0ALAC5EJ1nCH5MBxQNeiCAIiMsnO6yADEV+AUQcY5lrYs2DvLZCWnnpSnl9biASLGgCQiOWDeQe84JDDVBY5YrbwIDAQAB
privateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCvrU8kmgOOg+nqdofriFO4SpreGBj7u1x1p0/J7UZuFClIDLJ4rOQsPGtSt65HwMiaO61j532s0Mt0UlU3TviGgAkzNgpRHbNMGvBx2ZjS6KPcgd7dfNXu1B1VlMdaMItZheqi5gqQgibwPDnZdsJI9s80y4vX/tbXB6K1MsJlfbf1xojVuU5hqCSVM8YCPjQZvlpZR3G7AJHDOqADBHssz4557sbASzu9JvRwRz1ve5FmMqbuwh8hsEBtJ4R6vQAsALkQnWcIfkwHFA16IIAiIyyc7rIAMRX4BRBxjmWtizYO8tkJaeelKeX1uIBIsaAJCI5YN5B7zgkMNUFjlitvAgMBAAECggEAE/yDpIZhITWgxyv1CrbXz3+tXtcfAISwYDJIwZBdEuj4SVooc9I3o1C8ZQzApyknqWRgtZ0Aj0ix3OoBB+nUHHk0kr7zLYdTfrUR5eH7oQMWoV+lG024iRNYwwPKKlibgfPaXe4OBaLJC0vOyQ7Zy7NIn5kIr+ouRwh3WmYL97/FXhm7+MhfJS42279/kxeQNc74CHVO0WVYD67+xojzZFfM5Nq8VWG42m/FuBFXTO1nmMvuHzdtFw2158b4Emqry55LrV960PD9YILLNmFf9/c5bTi1u7h79DC47KTfY59hLxKWIZnE1AkFXKSfXNlF2NH0XaKZfLNyyJDxnzHwAQKBgQDnYTzFLx3QxjzliLX4R9leNdIeXt8Xze3chpgA44fOFsxSm2vkQVWEzUvYyWMjdLIbGNywANvC2ocQJ25GWYPS1CP4z5rVF/BgMOvVbsQWry2ZLIYWyc8wDgxiD7IwYWhNBG+Uuw8HFl7sF4kop/KgaP6pG52C+fTgvXedawfgQQKBgQDCXrto661Y4mBlKWOYWgLvzODFnI8bEbyvBXUT8iytum9qIUVQ6ZoIX6De9Bubr+m4Aw02RZs5uIG9RLtx/xGvUx74/IG9Uwh8RAXBnigBTM6GGhYZ9is/krzmgcxpvnHaQveNOghAxUDD1iawkrc3CcvqMezC0ZwyVTSAQgwfrwKBgEL/rBoo74hBruaENLUFERMvoH082XrKHYNK0f8H444wmc+dw5sftAS1ca3/ep6Mrvobs+OfDAObRZrO4Casyvgkh5oHe30S5n7kC5YM8ejjpt+Avf8hRsZSexF2HBHYUtxiWXEGzW4u8yOIGSZVo3MBlCQho/WGLXtaQaWqlWhBAoGAR5p8cd94gakLl9jSftqSAGM6XrIZKgCzwMpC4jEx8mIfDzrofTFBdFo+OkQ1M3pvoEFHibnEwFPPP7llUE6F5k+5tkHXTbacBqNMd5Ja7HeuEUrk33WHYykce9JPSplE+gH3jkhVp/7CqCJpKF00L4tlWoY/0VlEsGohKCqsqrMCgYAnLCTZwbhGJyk881x7eQqOSwPgzdMe0CYYIFGzBGKfzaR2viOpTcT7EH+/Jx+jALtlFVlWzC7in290XYydluZkhfEm5VVdn8pdmXg88iiR5lqkDOcW9pPnEEnxFcbpCNUgJDTgmNzc5euahulFoTRdlnchKs0WEMST2oKPak0VZA==
Encrypted Message: 12ff35876ec5f6f3668ecbed834b7b253618efadbc0b4aa379fc51085e16bbd28e34bf432646dc0d7e4f4087009d52c9bdec56133a99f6714d6c6874ffb08695123985695a923d76993636b971effaaa14f854cda273861476ca740f71afc74946c6c8f4462cf0c3eb9c690351942d776d0ac6061368100a9080c7ca929a781f8498a40ae24e6156142635be1ec5dd97472ca9dac1c7b68c2c87b8fe1cdebe14c10a5059fac8c5df838ba4164a775d80f41acea363c5fd313780163462621db449f1e393823f7a180e76b53cca6e9b6e292e6aa17e1607ac7a835de845b95c1efb7811cb9842d75dfbe5b377cad65971c210735ae7c10cee1b5d196c657e5c71
Decrypted Message: Hello, World!
ECC 公钥: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEKHo2k1n8tAjfc0SoaY0DxYdCi6/37xFkJi5r1Bnv/OYK6jJP5DOcYgnwk3rwQ50OS+SFr+FnlXfPO5R5LaA0Q==
ECC 私钥: MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgWwYN6xMEIk6thUld36jFO4ajuNYPV9QI1lWrEX47lgqgCgYIKoZIzj0DAQehRANCAAQQoejaTWfy0CN9zRKhpjQPFh0KLr/fvEWQmLmvUGe/85grqMk/kM5xiCfCTevBDnQ5L5IWv4WeVd887lHktoDR
签名: MEQCIFdO2y8Gcmi8CFa/D6VQ3TG/DhSx0hnkJ593MdEMEshTAiA0L+R83QpWgAW7NsFLrdXSvrpVhnVryfkeu8eAN9ebIA==
A 生成的共享密钥: 8e37c3fd8136e231328ea910d413dc91bb9537a3dd39582461deb88fe68df0ea75dd2b0673c79dc223e367f0d373fdd75413865db5970114e4dfbe57790ab607d0fcdcdf72aaeed3324433ff8c6be08b202c9f99031bbacb0c5cc0446cb86c24b82a6f9e6da35d682d75fae55123ca0594ef197be9229999332ad0115c79ac43314d6e32a2d42f33f8bd58c53c4821abf2498adbb72714c14f7ef7b3adccce1a4a3a8fc81b88e49a6a784dc3c2e28bfc4d51cedad728e32e1360004cbdfd5bc60b50526fa6bb5f7ebb860dc6a604d174f94a2b6e7ac8ea843c88151471a56d54fa517113bd710c07735fb15b3ec91f669bf4ea647fa09cc4e6b30f679a1aff3d
B 生成的共享密钥: 8e37c3fd8136e231328ea910d413dc91bb9537a3dd39582461deb88fe68df0ea75dd2b0673c79dc223e367f0d373fdd75413865db5970114e4dfbe57790ab607d0fcdcdf72aaeed3324433ff8c6be08b202c9f99031bbacb0c5cc0446cb86c24b82a6f9e6da35d682d75fae55123ca0594ef197be9229999332ad0115c79ac43314d6e32a2d42f33f8bd58c53c4821abf2498adbb72714c14f7ef7b3adccce1a4a3a8fc81b88e49a6a784dc3c2e28bfc4d51cedad728e32e1360004cbdfd5bc60b50526fa6bb5f7ebb860dc6a604d174f94a2b6e7ac8ea843c88151471a56d54fa517113bd710c07735fb15b3ec91f669bf4ea647fa09cc4e6b30f679a1aff3d
1.2.Hutool包使用
package asymmetric_encryption.hutool;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.core.codec.Base64;
public class RSAExample {
public static void RSADemo() {
// 创建 RSA 非对称加密对象,生成 2048 位密钥
RSA rsa = new RSA();
// 获取公钥和私钥
String publicKey = rsa.getPublicKeyBase64();
String privateKey = rsa.getPrivateKeyBase64();
System.out.println("RSA 公钥: " + publicKey);
System.out.println("RSA 私钥: " + privateKey);
// 要加密的消息
String message = "Hello, World!";
// 使用公钥加密
byte[] encryptedMessage = rsa.encrypt(message, KeyType.PublicKey);
System.out.println("加密后的消息: " + Base64.encode(encryptedMessage));
// 使用私钥解密
byte[] decryptedMessage = rsa.decrypt(encryptedMessage, KeyType.PrivateKey);
System.out.println("解密后的消息: " + new String(decryptedMessage));
}
}
package asymmetric_encryption.hutool;
import cn.hutool.crypto.asymmetric.ECIES;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
public class ECCExample {
public static void ECCDemo() {
// 创建 ECC 非对称加密对象
ECIES ecies = new ECIES();
// 生成密钥对
byte[] publicKey = ecies.getPublicKey().getEncoded();
byte[] privateKey = ecies.getPrivateKey().getEncoded();
System.out.println("ECC 公钥: " + cn.hutool.core.codec.Base64.encode(publicKey));
System.out.println("ECC 私钥: " + cn.hutool.core.codec.Base64.encode(privateKey));
// 要加密的消息
String message = "Hello, World!";
// 使用公钥加密
byte[] encryptedMessage = ecies.encrypt(message, KeyType.PublicKey);
System.out.println("加密后的消息: " + cn.hutool.core.codec.Base64.encode(encryptedMessage));
// 使用私钥解密
byte[] decryptedMessage = ecies.decrypt(encryptedMessage,KeyType.PrivateKey);
System.out.println("解密后的消息: " + new String(decryptedMessage));
}
}
ECC 公钥: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+NuRU/SRoc5kVMn1c+ZuG9VtX8AWzaD1KNPiKvTtiOQXqLZbEfKO1YsKqXUg4sqW6MnlOcBHqdedG53A6McObA==
ECC 私钥: MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgRCjKPEiVHls4VU4pm4abcV2xQw9oT5Qmo/9gHOKkgZagCgYIKoZIzj0DAQehRANCAAT425FT9JGhzmRUyfVz5m4b1W1fwBbNoPUo0+Iq9O2I5BeotlsR8o7ViwqpdSDiypboyeU5wEep150bncDoxw5s
加密后的消息: BM3b94CHhQQdvsTXnll43ARpkT6Uf2K2wOunGBdtGsF9uetI08PeDA+l3Fqd7X1cTBC3M8K9R8aZPMI0O28/kGGXeBzI67n1pt4rPgrp44yzhFZYmSuqVEtwYExyekFiEPA=
解密后的消息: Hello, World!
RSA 公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWH4XMCsuIgb80/cHdp94kcmOuWo4O2v/Kdk3hT7AnmdBLQZavQAfwZgZFyDSBVpFJcTo2ec4XOp2WIfTbj0TywsAvgrFbpV/BlOrK/vZU6Rg8Qr7lKxLXzuNtZTqEjMl/zhBVxjoQESn/1PerBETRqJMzUOo9IN1nRQBwUGnJMwIDAQAB
RSA 私钥: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANYfhcwKy4iBvzT9wd2n3iRyY65ajg7a/8p2TeFPsCeZ0EtBlq9AB/BmBkXINIFWkUlxOjZ5zhc6nZYh9NuPRPLCwC+CsVulX8GU6sr+9lTpGDxCvuUrEtfO421lOoSMyX/OEFXGOhARKf/U96sERNGokzNQ6j0g3WdFAHBQackzAgMBAAECgYApWSH9snH2VNPHGF+I/aMkl6BPKXZ4QOsXPjwwz7IdG5NBDRPbmLpPvmvkqtIUzdI1g/NxVJkrHCsVNE5z3Zk7CzZxBJBHixqymaelEgOBnVYjsVAMsKwmastetoIPwyMr9JMMe5QAC1zgFC7LjiGEFADaVISpWyUPIdXLGE3G3QJBAPewuefWBnh6+YJJWbe5FSurqjen8nwn18jadcsNIxMsreX37DTdANFXTQgwryDqHz8pzpd9hBlmJbIe5GG/g28CQQDdToGryCoH1y8Ws6Ii/Q07n6qus6rJhYCi+I/VTy/e/5pve9LQO806ChMi5Fcwt1lD1sLuLjB4r4k0Wv0txSR9AkAwW32AKMXsob2y1RVCDE140DQUV6K84J59ZUFYGkF9zdxJqKSiEX/GXy/36GFYoLzm/QeLhgLTXqD/bI6UEurbAkB8CZBsM5g7JMRjuPLbIXHVRTxpBpJmuMjMjvwu1l9CYYixi3kw9ROlwBfRqqGj0F/bwfcngAPy4I/KJGVazfARAkApvWDTzBog7f4bnzJ8CzDVmaBiNE3kgiHsuIrzqiB5VQg7mB1TQNRcNcCUTflqd2KcaBoVHUhwUoUHLSqYFonx
加密后的消息: NfizGbtj7xEGDWjysZwSLdjvxSC3bZkeLCuHgdJVShUL6lkY+XxJC5LT17GKWzT565MLE1wmTaUQ+siOQ8NWN3SBKYNaJgNK+LdG0DxvslNdFpqiZDSLlSe420A1YEuZsqMOHENl8M9MUxZZUrxoQBvN/dxgJO/qJdGvR28O9v8=
解密后的消息: Hello, World!
1.3.库Bouncy Castle实现
package asymmetric_encryption.bouncy_castle;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
public class BouncyCastleECCExample {
public static void ECCDemo() throws Exception {
// 添加 Bouncy Castle 提供者
Security.addProvider(new BouncyCastleProvider());
// 生成 ECC 密钥对
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("EC", "BC");
keyPairGen.initialize(256); // 使用 256 位的椭圆曲线
KeyPair keyPair = keyPairGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("ECC 公钥: " + Base64.toBase64String(publicKey.getEncoded()));
System.out.println("ECC 私钥: " + Base64.toBase64String(privateKey.getEncoded()));
// 使用公钥加密
Cipher cipher = Cipher.getInstance("ECIES", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedMessage = cipher.doFinal("Hello, this is a secret message!".getBytes());
System.out.println("加密消息: " + Base64.toBase64String(encryptedMessage));
// 使用私钥解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage = cipher.doFinal(encryptedMessage);
System.out.println("解密消息: " + new String(decryptedMessage));
}
}
package asymmetric_encryption.bouncy_castle;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
public class BouncyCastleRSAExample {
public static void RSADemo() throws Exception {
// 添加 Bouncy Castle 提供者
Security.addProvider(new BouncyCastleProvider());
// 生成 RSA 密钥对
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", "BC");
keyPairGen.initialize(2048);
KeyPair keyPair = keyPairGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("RSA 公钥: " + Base64.toBase64String(publicKey.getEncoded()));
System.out.println("RSA 私钥: " + Base64.toBase64String(privateKey.getEncoded()));
// 使用公钥加密
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedMessage = cipher.doFinal("Hello, this is a secret message!".getBytes());
System.out.println("加密消息: " + Base64.toBase64String(encryptedMessage));
// 使用私钥解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage = cipher.doFinal(encryptedMessage);
System.out.println("解密消息: " + new String(decryptedMessage));
}
}
RSA 公钥: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwZvqUXbY3/s/7kXSFaq6o7S1W4X5ErnZqZzcYGdPVnX1/E6q7pMdMx8ps2gwoQhK0gtj/AgM6V1H2344WCa0TkPKX2UuLi3vjEGOWzE7B+G8bpcEl8vA4Fx/sGixTlzlDD8E01MLGKk4Da91KxlowS16/bmkRl6WKNMgNn+iwY5bzDyiwCaSKaslTo2YwQxij4vgpZBB17fTTO++6Vw8ktTxsMLiTYcJt5ScYMg60pahdYiLqm/omK+KT70ycnAL5HEcHf3qWKZllYcCZ40daw96VjRxQoAZPy6iSJyxvnt7HbcqfYiDLYYx9d3TH40sQ9+tgmJwUFq8wTZo+pYDewIDAQAB
RSA 私钥: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDBm+pRdtjf+z/uRdIVqrqjtLVbhfkSudmpnNxgZ09WdfX8Tqrukx0zHymzaDChCErSC2P8CAzpXUfbfjhYJrROQ8pfZS4uLe+MQY5bMTsH4bxulwSXy8DgXH+waLFOXOUMPwTTUwsYqTgNr3UrGWjBLXr9uaRGXpYo0yA2f6LBjlvMPKLAJpIpqyVOjZjBDGKPi+ClkEHXt9NM777pXDyS1PGwwuJNhwm3lJxgyDrSlqF1iIuqb+iYr4pPvTJycAvkcRwd/epYpmWVhwJnjR1rD3pWNHFCgBk/LqJInLG+e3sdtyp9iIMthjH13dMfjSxD362CYnBQWrzBNmj6lgN7AgMBAAECggEAWs33ML0Wi7qJ6gWaOmpIPjanpqTnxGYhVcFJxPc/STRrKip1Vg7ur4bqpofz4tsCSJBqFQ9ritoitSn2YDXK9DgsRuCsL6GAzB4FF/U3lANGPvIah91a+X+4rbL0keXU0ZEPANRejHL1ZMnJoOy6anwbxruWdiCvubcH0Te8zJ1YvIEICDPT7fih42e/Q2DqrpMBUXbNuVhbgXWxV7KPwvKFCaaujrFy+B/hkqJucAUioUuaJtT7tacHe9QsRsFM9ocCNCoVHxbwE8nxtqACtZz7S305s6e6i4LdfVIh9dj6s8EwafQ/lmNhX7ivPKe1eto2iAQ7friiBGEqQbTVuQKBgQDkvsLL3cWixTih68+8Q8xaOm7L939sFY8i980Ajiiywpc9ltigkah/L8wCcwN2awTzGOwP72yt8VKkRxOcWZoC+QW7wxfVqyNjRzUoN0/EV16ZJ1Ie6dbLJg/5RK2k7USJHfGfmeGMBmaPLY0lu2K7MYv7gvXu/q7t8n4ptzPFwwKBgQDYrWyb789GfHED52LDA+Wc2zTcG7b8D3S1kH7/MOno57AVlgA50Y6Qg43N0NXHGnqieBf65nlnMrXvKLODW7jqkUeEBmT+XCHzTeQAmn1gF7yul2QavuQlFx8krTx/2yWgJvEg+TFYN5w7yUBqhKkEuXakna+HhSHlnG8xF9uX6QKBgQClityk95GhU8PBg0wqvpI0tlca67neudeGAfntrfQMMsGLhBCwW9mqeifVmfDmkVrap62ndqmbVKtvUjUCEOJhxmB82xrzuk/4+D6jJSxoNqayhf9reeXFzXz/89ELK99OsEn+LDpLwRIWCmw841j3ikr5MXTUiqKEd9sQS5J/SwKBgQCeINJmavjF5ANGahL1Z16mvoMxLzi3c0AlUTKdYkESrCMhXbsEdx6n8JoIXiPljjl5YFN/07s9yRBlXTrE3qdw6F1cyJ3j07EjMvD2T8i33Bri/7Eao700JE+iIJtKY9BttH29Jp8QVmU6bIEKO45t2DvxnvJ+4HYAb83l8hdcIQKBgQCSJj4ZXSYxuea5H8oP0Oi0FbVKPcTcFHsNm484A5JSCgow9aExtI73k0cdQsOCgRxiGWTl4wWsB1JwpSI3ibq5l1jblMeqAeLxLLFpSWWXYWyXfA+6knbF1qhEeRYPmQWPUEE8l3SjZasRHshYk+ukehlSzywptydZVKbIuIviTA==
加密消息: SUTCZ70ICxPJW+G5G+kw8vqHqegxk6kBvuP1TCn3Ga7hlGjfC9I0u5paO86M0vpd1bMdPWX0khOlgPe8C+cNxn7K7lYlbwjzrqrr5tODKIZwUg33wM/LGpUV6XhWv1qMjBcAzBSHqO0Koso6xrLzrN42/b32oLxmFOwEWAcfDlJ6sEWT0KS/X0FSY/SHbrBZVVwB43gN7QNGvnh22Dek3LicawxYEwvTTjfdbf9K0b/iiLtQoVRfaC7nwm4bBGc1xSImo4upaXN+jLXtw3aK9/JBC2azZncSv+4NJWNSYlSHC4uk36PZqCKl6zly/MS4dPwSJbcovAGd24TQiKRXbw==
解密消息: Hello, this is a secret message!
ECC 公钥: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvB5M2an/YkzomTxEA1uZcy696O7xk3u/Dz0i7IrcB+1B12WrHtqJrRgKeePHVeg94Y+dxkJ3PrdcLKn51/qJaw==
ECC 私钥: MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgx3KL5Xiv+/ZQZNWwhLYeEw6Tp5r/mYI6msI/j1vnvQmgCgYIKoZIzj0DAQehRANCAAS8HkzZqf9iTOiZPEQDW5lzLr3o7vGTe78PPSLsitwH7UHXZase2omtGAp548dV6D3hj53GQnc+t1wsqfnX+olr
加密消息: BP0dLeL78X41WQU1McMSvqxmZBRkVSPitHW1/jkMx5mVb5p3DNBqd17KP4HRjGDCOq4JB2bavyp6vTm+3czbXw3aVzTNMCGcSnlzgHGXVUP0b14wNCZotTfNlwB88Oh0KlK19Bk4ShElHONH5Ah8zW9efU3O
解密消息: Hello, this is a secret message!
2.C#中的使用
2.1. 原生使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
namespace ConsoleSymmetricEncryption
{
public class RSAExample
{
public static void RSADemo()
{
using (RSA rsa = RSA.Create())
{
// 导出公钥和私钥
var publicKey = rsa.ExportRSAPublicKey();
var privateKey = rsa.ExportRSAPrivateKey();
string originalMessage = "Hello, RSA! 小菜";
byte[] messageBytes = Encoding.UTF8.GetBytes(originalMessage);
// 加密
byte[] encryptedMessage = rsa.Encrypt(messageBytes, RSAEncryptionPadding.Pkcs1);
string encryptedText = Convert.ToBase64String(encryptedMessage);
// 解密
byte[] decryptedMessage = rsa.Decrypt(encryptedMessage, RSAEncryptionPadding.Pkcs1);
string decryptedText = Encoding.UTF8.GetString(decryptedMessage);
Console.WriteLine($"encryptedText: {encryptedText}");
Console.WriteLine($"decryptedText: {decryptedText}");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
namespace ConsoleSymmetricEncryption
{
public class ECCExample
{
public static void ECCSignDemo()
{
using (ECDsa ecdsa = ECDsa.Create())
{
// 生成密钥对
byte[] publicKey = ecdsa.ExportSubjectPublicKeyInfo();
byte[] privateKey = ecdsa.ExportECPrivateKey();
string originalMessage = "Hello, ECC!";
byte[] messageBytes = Encoding.UTF8.GetBytes(originalMessage);
// 签名
byte[] signature = ecdsa.SignHash(SHA256.HashData(messageBytes));
// 验证签名
bool isValid = ecdsa.VerifyHash(SHA256.HashData(messageBytes), signature);
Console.WriteLine($"Original Message: {originalMessage}");
Console.WriteLine($"Is Signature Valid: {isValid}");
}
}
public static void ECCDemo()
{
// Alice 和 Bob 各自生成 ECC 密钥对
using (ECDiffieHellmanCng bob = new ECDiffieHellmanCng())
{
ECDiffieHellmanCng alice = new ECDiffieHellmanCng();
alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
alice.HashAlgorithm = CngAlgorithm.Sha256;
bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
bob.HashAlgorithm = CngAlgorithm.Sha256;
// Alice 获取 Bob 的公钥,生成共享密钥
byte[] alicePublicKey = bob.PublicKey.ToByteArray();
byte[] aliceSharedKey = alice.DeriveKeyMaterial(CngKey.Import(alicePublicKey, CngKeyBlobFormat.EccPublicBlob));
// Bob 获取 Alice 的公钥,生成共享密钥
byte[] bobPublicKey = alice.PublicKey.ToByteArray();
byte[] bobSharedKey = bob.DeriveKeyMaterial(CngKey.Import(bobPublicKey, CngKeyBlobFormat.EccPublicBlob));
// 确保 Alice 和 Bob 生成的共享密钥是相同的
Console.WriteLine($"Alice's Shared Key: {Convert.ToBase64String(aliceSharedKey)}");
Console.WriteLine($"Bob's Shared Key: {Convert.ToBase64String(bobSharedKey)}");
Console.WriteLine($"Keys are equal: {Convert.ToBase64String(aliceSharedKey) == Convert.ToBase64String(bobSharedKey)}");
// 使用共享密钥进行 AES 加密和解密
string originalMessage = "Hello, ECC with AES!";
byte[] encryptedMessage = AESEncrypt(originalMessage, aliceSharedKey);
string decryptedMessage = AESDecrypt(encryptedMessage, bobSharedKey);
Console.WriteLine($"Original Message: {originalMessage}");
Console.WriteLine($"Decrypted Message: {decryptedMessage}");
}
}
// AES 加密方法
private static byte[] AESEncrypt(string plainText, byte[] key)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
aes.GenerateIV(); // 随机生成 IV
using (ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV))
{
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
// 返回 IV 和加密的数据
byte[] result = new byte[aes.IV.Length + encryptedBytes.Length];
Array.Copy(aes.IV, 0, result, 0, aes.IV.Length);
Array.Copy(encryptedBytes, 0, result, aes.IV.Length, encryptedBytes.Length);
return result;
}
}
}
// AES 解密方法
private static string AESDecrypt(byte[] encryptedData, byte[] key)
{
using (Aes aes = Aes.Create())
{
aes.Key = key;
// 提取 IV
byte[] iv = new byte[aes.BlockSize / 8];
byte[] cipherText = new byte[encryptedData.Length - iv.Length];
Array.Copy(encryptedData, iv, iv.Length);
Array.Copy(encryptedData, iv.Length, cipherText, 0, cipherText.Length);
aes.IV = iv;
using (ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV))
{
byte[] decryptedBytes = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
return Encoding.UTF8.GetString(decryptedBytes);
}
}
}
}
}
encryptedText: Q8TCZh5f6u8dOSRYigreS2DIUy4fLV8pQlaklqi3pcz5zm7ZYX4p2d3fHYE7hKMmyvqYiZxSL+q4MyMJX8rKxgF94Q0Ba25Sa3RxHSbgAM3fkREnn9eS5cK+xk2kCX/tqsHl4ZT/6zTBoiHugec9eta7J+1zEblyEbprHbCe2SXLJDd64TbqqZTF7qo6OSyMcwP5v9PJHb1zSdLuDeHvfP7Uwydvrq9TdPZH3Bc0LnJElb8oEdCaFYRlMYCcRfs1gu0rnUpCl7ELUvZ+jxgcb4Xnup/jzoZfRamvvEM3f4tEHLiOCVkyAw729RavXJhsgWrj55liqgOP0dnbDqn0kA==
decryptedText: Hello, RSA! 小菜
Original Message: Hello, ECC!
Is Signature Valid: True
Alice's Shared Key: FEmE+ZdiM68D/XRMquoNzWWBjcorVYannZ+xoVXTh5U=
Bob's Shared Key: FEmE+ZdiM68D/XRMquoNzWWBjcorVYannZ+xoVXTh5U=
Keys are equal: True
Original Message: Hello, ECC with AES!
Decrypted Message: Hello, ECC with AES!
2.2.库Bouncy Castle实现
using System;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Security;
public class RSAWithBouncyCastleExample
{
public static void RSAWithBouncyCastleDemo()
{
// 生成 RSA 密钥对
AsymmetricCipherKeyPair keyPair = GenerateRSAKeyPair();
var publicKey = (RsaKeyParameters)keyPair.Public;
var privateKey = (RsaKeyParameters)keyPair.Private;
// 要加密的原始信息
string originalMessage = "Hello, RSA with Bouncy Castle!";
byte[] messageBytes = Encoding.UTF8.GetBytes(originalMessage);
// 使用公钥加密
byte[] encryptedData = Encrypt(messageBytes, publicKey);
Console.WriteLine($"Encrypted Data: {Convert.ToBase64String(encryptedData)}");
// 使用私钥解密
byte[] decryptedData = Decrypt(encryptedData, privateKey);
string decryptedMessage = Encoding.UTF8.GetString(decryptedData);
Console.WriteLine($"Decrypted Message: {decryptedMessage}");
}
// 生成 RSA 密钥对
public static AsymmetricCipherKeyPair GenerateRSAKeyPair()
{
var keyGenerationParameters = new KeyGenerationParameters(new SecureRandom(), 2048); // 2048位密钥
var keyPairGenerator = new RsaKeyPairGenerator();
keyPairGenerator.Init(keyGenerationParameters);
return keyPairGenerator.GenerateKeyPair();
}
// 使用公钥加密
public static byte[] Encrypt(byte[] plainText, RsaKeyParameters publicKey)
{
var engine = new RsaEngine();
engine.Init(true, publicKey); // true表示加密
return engine.ProcessBlock(plainText, 0, plainText.Length);
}
// 使用私钥解密
public static byte[] Decrypt(byte[] cipherText, RsaKeyParameters privateKey)
{
var engine = new RsaEngine();
engine.Init(false, privateKey); // false表示解密
return engine.ProcessBlock(cipherText, 0, cipherText.Length);
}
}
using System;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Agreement;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Paddings;
using Org.BouncyCastle.Crypto.Modes;
public class ECCWithAESExample
{
public static void ECCWithBouncyCastleDemo()
{
// 生成 Alice 和 Bob 的 ECC 密钥对
var keyPairGenerator = new ECKeyPairGenerator();
var keyGenParams = new KeyGenerationParameters(new SecureRandom(), 256);
keyPairGenerator.Init(keyGenParams);
// Alice 和 Bob 各自生成密钥对
AsymmetricCipherKeyPair aliceKeyPair = keyPairGenerator.GenerateKeyPair();
AsymmetricCipherKeyPair bobKeyPair = keyPairGenerator.GenerateKeyPair();
var alicePublicKey = (ECPublicKeyParameters)aliceKeyPair.Public;
var alicePrivateKey = (ECPrivateKeyParameters)aliceKeyPair.Private;
var bobPublicKey = (ECPublicKeyParameters)bobKeyPair.Public;
var bobPrivateKey = (ECPrivateKeyParameters)bobKeyPair.Private;
// 通过密钥交换生成共享密钥
byte[] aliceSharedKey = GenerateSharedSecret(alicePrivateKey, bobPublicKey);
byte[] bobSharedKey = GenerateSharedSecret(bobPrivateKey, alicePublicKey);
// 确保共享密钥相同
Console.WriteLine($"Alice Shared Key: {Convert.ToBase64String(aliceSharedKey)}");
Console.WriteLine($"Bob Shared Key: {Convert.ToBase64String(bobSharedKey)}");
Console.WriteLine($"Keys are equal: {Convert.ToBase64String(aliceSharedKey) == Convert.ToBase64String(bobSharedKey)}");
// 使用共享密钥进行 AES 加密和解密
string originalMessage = "Hello, ECC with AES!";
byte[] encryptedMessage = AESEncrypt(originalMessage, aliceSharedKey);
string decryptedMessage = AESDecrypt(encryptedMessage, bobSharedKey);
Console.WriteLine($"Original Message: {originalMessage}");
Console.WriteLine($"Decrypted Message: {decryptedMessage}");
}
// 生成共享密钥(ECC 密钥交换)
private static byte[] GenerateSharedSecret(ECPrivateKeyParameters privateKey, ECPublicKeyParameters publicKey)
{
var agreement = new ECDHBasicAgreement();
agreement.Init(privateKey);
var sharedSecret = agreement.CalculateAgreement(publicKey);
return sharedSecret.ToByteArray();
}
// AES 加密方法
private static byte[] AESEncrypt(string plainText, byte[] key)
{
// 截取共享密钥的一部分用于 AES 密钥
byte[] aesKey = new byte[16];
Array.Copy(key, 0, aesKey, 0, 16);
var aesEngine = new AesEngine();
var cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(aesEngine));
cipher.Init(true, new KeyParameter(aesKey));
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] encryptedBytes = new byte[cipher.GetOutputSize(plainBytes.Length)];
int length = cipher.ProcessBytes(plainBytes, 0, plainBytes.Length, encryptedBytes, 0);
cipher.DoFinal(encryptedBytes, length);
return encryptedBytes;
}
// AES 解密方法
private static string AESDecrypt(byte[] cipherText, byte[] key)
{
byte[] aesKey = new byte[16];
Array.Copy(key, 0, aesKey, 0, 16);
var aesEngine = new AesEngine();
var cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(aesEngine));
cipher.Init(false, new KeyParameter(aesKey));
byte[] decryptedBytes = new byte[cipher.GetOutputSize(cipherText.Length)];
int length = cipher.ProcessBytes(cipherText, 0, cipherText.Length, decryptedBytes, 0);
cipher.DoFinal(decryptedBytes, length);
return Encoding.UTF8.GetString(decryptedBytes).TrimEnd('\0');
}
}
Alice Shared Key: AMKHXIMVFLpUalPjkgKJrGtfH2/x9dU47Ls3Ci7Xst15
Bob Shared Key: AMKHXIMVFLpUalPjkgKJrGtfH2/x9dU47Ls3Ci7Xst15
Keys are equal: True
Original Message: Hello, ECC with AES!
Decrypted Message: Hello, ECC with AES!
Encrypted Data: HFZyDohNGBXmx5SXRXc8eHUfd9iw/18AHJRGkgRlANxMGFHX6K4sg3c+6XuYkhiA7tZABl79xhkqW9FPM1Mgkjc2IhYlNMUpdCmvplsvTCtmNnsArc/S2KfZOb7uNqXrw24tNJaFVsbEbgX00FZ94A0ix47PPt2pUTxeqfEfFGMmZaN0Iwe2M8e+os44iY1cHCOiKidKxByOwanrkTvTLEciOyncW0iBkzJR6DcCM8fSaaL1pvkaeVSdoPKIOjANrKLt594DZAGt2xEejR+/KOtNl7W8HDn2qSUGmACrTR9wfMzT67zW67Pz2Kb4UiOjekBYANnmSenHZOgWsrjVHQ==
Decrypted Message: Hello, RSA with Bouncy Castle!
原文地址:https://blog.csdn.net/a13407142317/article/details/142743124
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!