使用Fisherman jce配合加密卡sm3加密的java代码示例
时间: 2023-12-30 22:02:48 浏览: 48
下面是使用Fisherman jce配合加密卡sm3加密的Java代码示例:
```java
import cn.fisherman.security.sm.SM3Digest;
import cn.fisherman.security.sm.SM3Key;
import cn.fisherman.security.sm.SM3KeyGenerator;
import cn.fisherman.security.sm.SM3ParameterSpec;
import cn.fisherman.security.sm.SM3PrivateKey;
import cn.fisherman.security.sm.SM3PublicKey;
import cn.fisherman.security.sm.SM3Signature;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.Signature;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class SM3Test {
public static void main(String[] args) throws Exception {
Security.addProvider(new cn.fisherman.security.jce.provider.FishermanProvider());
// 生成SM3密钥对
SM3KeyGenerator keyGen = new SM3KeyGenerator();
SM3Key key = keyGen.generateKey();
SM3PrivateKey privateKey = key.getPrivate();
SM3PublicKey publicKey = key.getPublic();
// SM3加密
SM3Digest digest = new SM3Digest();
byte[] data = "Hello World!".getBytes();
digest.update(data, 0, data.length);
byte[] result = new byte[digest.getDigestSize()];
digest.doFinal(result, 0);
System.out.println("SM3加密结果:" + bytesToHex(result));
// SM3签名
SM3Signature signature = new SM3Signature();
signature.initSign(privateKey);
signature.update(data, 0, data.length);
byte[] sign = signature.sign();
System.out.println("SM3签名结果:" + bytesToHex(sign));
// SM3验签
signature.initVerify(publicKey);
signature.update(data, 0, data.length);
if (signature.verify(sign)) {
System.out.println("SM3验签成功");
} else {
System.out.println("SM3验签失败");
}
// AES加密
byte[] keyBytes = "1234567890abcdef".getBytes();
byte[] ivBytes = "0123456789abcdef".getBytes();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "FishermanJCE");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] cipherText = cipher.doFinal(data);
System.out.println("AES加密结果:" + bytesToHex(cipherText));
// AES解密
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] plainText = cipher.doFinal(cipherText);
System.out.println("AES解密结果:" + new String(plainText));
// RSA加密
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", "FishermanJCE");
keyPairGen.initialize(2048);
KeyPair keyPair = keyPairGen.genKeyPair();
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "FishermanJCE");
rsaCipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] rsaCipherText = rsaCipher.doFinal(data);
System.out.println("RSA加密结果:" + bytesToHex(rsaCipherText));
// RSA解密
rsaCipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] rsaPlainText = rsaCipher.doFinal(rsaCipherText);
System.out.println("RSA解密结果:" + new String(rsaPlainText));
// 数字签名
Signature rsaSignature = Signature.getInstance("SHA256withRSA", "FishermanJCE");
rsaSignature.initSign(keyPair.getPrivate());
rsaSignature.update(data, 0, data.length);
byte[] rsaSign = rsaSignature.sign();
System.out.println("RSA数字签名结果:" + bytesToHex(rsaSign));
// RSA验签
rsaSignature.initVerify(keyPair.getPublic());
rsaSignature.update(data, 0, data.length);
if (rsaSignature.verify(rsaSign)) {
System.out.println("RSA验签成功");
} else {
System.out.println("RSA验签失败");
}
}
private static String bytesToHex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b: bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}
}
```
注意,这里使用了Fisherman JCE提供的SM3实现,需要先导入Fisherman JCE的jar包。另外,加密卡的具体使用方式可能需要根据加密卡的具体型号和使用场景进行调整。