import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class SM2Util {
static {
Security.addProvider(new BouncyCastleProvider());
}
private static final String KEY_ALGORITHM = "SM2";
private static final String SIGNATURE_ALGORITHM = "SHA256withSM2";
private static final String PUBLIC_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgDxYqNfz3jLh7cFvUW+1lQIDAQABAkEAoOeJXtPnC7Zi3rVZb1dIaR5Sg/9y+oDZa2pBm3a2u1XW1sAIhAO0Q2yQ0qz55aF+ among other characters"; // 你的公钥
private static final String PRIVATE_KEY = "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgDxYqNfz3jLh7cFvUW+1lQIDAKCBiASCAQEwUQIHZ57a455aF+ among other characters"; // 你的私钥
public static byte[] encrypt(String plainText) throws Exception {
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(PUBLIC_KEY));
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance("SM2", BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(plainText.getBytes());
}
public static byte[] decrypt(byte[] cipherText) throws Exception {
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(PRIVATE_KEY));
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance("SM2", BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(cipherText);
}
public static void main(String[] args) {
try {
String original = "Hello, SM2!";
System.out.println("Original: " + original);
byte[] encrypted = encrypt(original);
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
byte[] decrypted = decrypt(encrypted);
System.out.println("Decrypted: " + new String(decrypted));
} catch (Exception e) {
e.printStackTrace();
}
}
}
引入依赖:
org.bouncycastle.jce.provider.BouncyCastleProvider 提供对 SM2 算法的支持。需要确保项目中已添加 BouncyCastle 库。初始化安全提供者:
定义常量:
KEY_ALGORITHM 和 SIGNATURE_ALGORITHM 分别指定使用的加密和签名算法。PUBLIC_KEY 和 PRIVATE_KEY 是你的公钥和私钥(需替换为实际的公钥和私钥)。加密方法:
encrypt 方法使用公钥对明文进行加密。首先将公钥编码为 X509EncodedKeySpec 格式,然后生成 PublicKey 对象,最后使用 Cipher 类进行加密操作。解密方法:
decrypt 方法使用私钥对密文进行解密。首先将私钥编码为 PKCS8EncodedKeySpec 格式,然后生成 PrivateKey 对象,最后使用 Cipher 类进行解密操作。主方法:
main 方法用于测试加密和解密功能,输出原始字符串、加密后的字符串以及解密后的字符串。请确保在实际使用时替换 PUBLIC_KEY 和 PRIVATE_KEY 为真实的公钥和私钥。
上一篇:java get请求
下一篇:java换行
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站