sm2非对称加密java程序
时间: 2023-11-27 21:46:39 浏览: 32
以下是使用Java实现SM2非对称加密的示例代码:
```java
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
import java.security.Security;
public class SM2Demo {
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider());
// 生成密钥对
ECKeyPairGenerator gen = new ECKeyPairGenerator();
ECDomainParameters ecSpec = ECDomainParametersUtil.getSM2Parameters();
ECKeyGenerationParameters keyGenParam = new ECKeyGenerationParameters(ecSpec, null);
gen.init(keyGenParam);
AsymmetricCipherKeyPair keyPair = gen.generateKeyPair();
ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate();
ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic();
// 明文
String plainText = "Hello, SM2!";
// 加密
SM2Engine engine = new SM2Engine();
engine.init(true, new ParametersWithRandom(publicKey, new SecureRandom()));
byte[] cipherText = engine.processBlock(plainText.getBytes(), 0, plainText.getBytes().length);
// 解密
engine.init(false, privateKey);
byte[] decryptedText = engine.processBlock(cipherText, 0, cipherText.length);
// 验证解密结果
if (plainText.equals(new String(decryptedText))) {
System.out.println("SM2 decryption succeeded!");
} else {
System.out.println("SM2 decryption failed!");
}
// 签名
SM2Signer signer = new SM2Signer();
signer.init(true, privateKey);
signer.update(plainText.getBytes(), 0, plainText.getBytes().length);
byte[] signature = signer.generateSignature();
// 验证签名
signer.init(false, publicKey);
signer.update(plainText.getBytes(), 0, plainText.getBytes().length);
if (signer.verifySignature(signature)) {
System.out.println("SM2 signature verification succeeded!");
} else {
System.out.println("SM2 signature verification failed!");
}
}
}
```
需要注意的是,上述代码中使用了Bouncy Castle作为SM2算法的实现库。在使用前需要先引入Bouncy Castle的相关依赖。此外,代码中还使用了ECDomainParametersUtil类,该类用于获取SM2算法所需的椭圆曲线参数,需要自行实现。