/**
*
*/
package com.doubleca.sample.pki.jce;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.KeyStore.Entry;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Enumeration;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import com.doubleca.b146.c16.util.encoders.Base64;
import doubleca.security.provider.DoubleCA;
import doubleca.security.provider.jdk7.sm4.SM4KeySpec;
/**
* @author
*
*/
public class Test
{
private static final String SIGNATURE_KEY_ALGORITHM = "SM2";
private static final String SIGNATURE_ALGORITHM = "SM3withSM2";
private static final int SIGNATURE_KEY_SIZE = 256;
private static final String DIGEST_ALGORITHM = "SM3";
private static final String CIPHER_KEY_ALGORITHM = "SM4";
// private static final String CIPHER_ALGORITHM = "SM4/ECB/PKCS5Padding";
private static final String CIPHER_ALGORITHM = "SM4/CBC/PKCS5Padding";
// private static final String CIPHER_ALGORITHM = "SM4/ECB/NOPadding";
// private static final String CIPHER_ALGORITHM = "SM4/CBC/NOPadding";
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
/**
* 说明:JDK7版本及以上,JDK需要使用无限制的策略文件 UnlimitedJCEPolicy
* 否则,SM2密钥长度为256位,JCE无法调用成功
*/
try
{
Security.addProvider(new DoubleCA());
System.out.println("");
System.out.println("TestSM2KeyPairGenerator");
KeyPair key = TestSM2KeyPairGenerator();
System.out.println("");
System.out.println("TestSM2KeyFactory");
TestSM2KeyFactory(key.getPublic().getEncoded(), key.getPrivate().getEncoded());
System.out.println("");
System.out.println("TestSM3Digest");
TestSM3Digest();
System.out.println("");
System.out.println("TestSM4Cipher");
SecretKey sm4key = TestSM4Cipher();
System.out.println("");
System.out.println("TestSM2AsymmetricCipher");
TestSM2AsymmetricCipher(key);
System.out.println("");
System.out.println("TestSM2Signature");
TestSM2Signature(key);
System.out.println("");
System.out.println("TestReadDCKS");
TestReadDCKS("resources/1E7A9FA952485DBD8452B1B7BDBB8DF4.dcks", "DoubleCA");
System.out.println("");
System.out.println("TestCreateDCKS");
TestCreateDCKS("resources/SM2SigningCert.dcks", "111111", key, sm4key);
System.out.println("");
System.out.println("TestReadDCKS");
TestReadDCKS("resources/SM2SigningCert.dcks", "111111");
System.out.println("");
System.out.println(" finish.");
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public static SecretKey TestSM4Cipher()
{
try
{
String plainText1 = "偶像:";
String plainText2 = "握奇数据王幼君总裁!";
byte[] plain1 = plainText1.getBytes();
byte[] plain2 = plainText2.getBytes();
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_KEY_ALGORITHM, DoubleCA.PROVIDER_NAME);
SM4KeySpec keySpec = new SM4KeySpec("1234567812345678".getBytes("utf-8"));
IvParameterSpec iv = new IvParameterSpec("1234567812345678".getBytes());
SecretKey key = keyFactory.generateSecret(keySpec);
BigInteger keyBuffer = new BigInteger(1, key.getEncoded());
System.out.println("SM4 Key :" + keyBuffer.toString(16).toUpperCase());
// KeyGenerator kgen = KeyGenerator.getInstance("OID.1.2.156.10197.1.104");
// KeyGenerator kgen = KeyGenerator.getInstance("1.2.156.10197.1.104");
// KeyGenerator kgen = KeyGenerator.getInstance("SMS4");
KeyGenerator kgen = KeyGenerator.getInstance(CIPHER_KEY_ALGORITHM);
kgen.init(128, new SecureRandom("12345678".getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec sm4keySpec = new SecretKeySpec(enCodeFormat, CIPHER_KEY_ALGORITHM);
keyBuffer = new BigInteger(1, sm4keySpec.getEncoded());
System.out.println("SM4KeySpec :" + keyBuffer.toString(16).toUpperCase());
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);// 创建密码器
// cipher.init(Cipher.ENCRYPT_MODE, sm4keySpec);// 初始化
cipher.init(Cipher.ENCRYPT_MODE, sm4keySpec, iv);// 初始化
byte[] sm4ResultBuffer = new byte[cipher.getOutputSize(plain1.length + plain2.length)];
int bufferLen = cipher.update(plain1, 0, plain1.length, sm4ResultBuffer, 0);
bufferLen += cipher.update(plain2, 0, plain2.length, sm4ResultBuffer, bufferLen);
bufferLen += cipher.doFinal(sm4ResultBuffer, bufferLen);
byte[] result = new byte[bufferLen];
System.arraycopy(sm4ResultBuffer, 0, result, 0, sm4ResultBuffer.length);
BigInteger buffer = new BigInteger(1, result);
System.out.println("原文1:" + plainText1);
System.out.println("原文2:" + plainText2);
System.out.println("密文:" + new String(Base64.encode(result)));
// cipher.init(Cipher.DECRYPT_MODE, sm4keySpec);// 初始化
cipher.init(Cipher.DECRYPT_MODE, sm4keySpec, iv);// 初始化
sm4ResultBuffer = new byte[cipher.getOutputSize(result.length)];
bufferLen = cipher.update(result, 0, result.length / 2, sm4ResultBuffer, 0);
bufferLen += cipher.update(result, result.length / 2, result.length - (result.length / 2), sm4ResultBuffer, bufferLen);
bufferLen += cipher.doFinal(sm4ResultBuffer, bufferLen);
result = new byte[bufferLen];
System.arraycopy(sm4ResultBuffer, 0, result, 0, result.length);
System.out.println("原文:" + new String(result));
return key;
}
catch (Exception ex)
{
ex.printStackTrace();
return null;
}
}
public static void TestSM3Digest()
{
try
{
MessageDigest md = MessageDigest.getInstance(DIGEST_ALGORITHM);
byte[] result;
md.update("偶像:握奇数据王幼君总裁!".getBytes());
// byte[] result = md.digest("1234512345".getBytes());
result = md.digest();
System.out.println(md.getAlgorithm() + " MessageDigest : " + new BigInteger(1, result).toString(16).toUpperCase());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public static void TestSM2Signature(KeyPair key) throws NoSuchAlgorithmException, SignatureException, InvalidKeyException
{
String content = "偶像:握奇数据王幼君总裁!";
System.out.println("原文:" + content);
java.security.Signature signature = java.security.Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(key.getPrivate());
signature.update(content.getBytes());
byte[] signValue = signature.sign();
System.out.println("签名值:" + new String(Base64.encode(signValue)));
signature.initVerify(key.getPublic());
signature.update(content.getBytes());
boolean result = signature.verify(signValue);
System.out.println("签名验证结果 :" + result);
}
public static void TestSM2AsymmetricCipher(KeyPair key)
{
try
{
Cipher cipher = Cipher.getInstance("SM2/ECB/NOPadding");
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
String pla
没有合适的资源?快使用搜索试试~ 我知道了~
DoubleCA版本的国密算法JCE(Java Cryptography Extension)完整实现(含详细测试和应用代码)
共8个文件
dcks:2个
cer:1个
java:1个
4星 · 超过85%的资源 需积分: 41 141 下载量 48 浏览量
2018-03-22
23:42:36
上传
评论 4
收藏 821KB ZIP 举报
温馨提示
大宝CA完整地实现了国密SM2、SM3、SM4算法和JKS功能,可加密、解密、数字签名、验证、摘要计算,可存储和应用SM2软证书和软密钥。可惜没有源码,只有详细的测试和应用样例代码。
资源推荐
资源详情
资源评论
收起资源包目录
jce-doubleca-sample.zip (8个子文件)
jce-doubleca-sample
bin
resources
sm2cert.cer 590B
1E7A9FA952485DBD8452B1B7BDBB8DF4.dcks 3KB
SM2SigningCert.dcks 1KB
.settings
org.eclipse.jdt.core.prefs 598B
src
com
doubleca
sample
pki
jce
Test.java 13KB
.project 395B
.classpath 376B
lib
doubleca-jce-0.9.2-SNAPSHOT.jar 897KB
共 8 条
- 1
大宝CA国密SSL国密TOMCAT
- 粉丝: 65
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页