0


java实现国产SM3、SM4加密

引入依赖:

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.54</version></dependency>

完整代码:

packageutils;importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importorg.bouncycastle.pqc.math.linearalgebra.ByteUtils;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjava.io.UnsupportedEncodingException;importjava.security.AlgorithmParameters;importjava.security.Key;importjava.security.SecureRandom;importjava.security.Security;importjava.util.Arrays;importjava.util.UUID;/**
 * @description: SM4加密
 * @author: 张璞
 * @date 10:20 2022/9/13
 */publicclassSm4Util{static{Security.addProvider(newBouncyCastleProvider());}privatestaticfinalString ENCODING ="UTF-8";publicstaticfinalString ALGORITHM_NAME ="SM4";/**
     * 功能描述: 加密算法/分组加密模式/分组填充方式\PKCS5Padding-以8个字节为一组进行分组加密\定义分组加密模式使用:PKCS5Paddings
     */publicstaticfinalString ALGORITHM_NAME_CBC_PADDING ="SM4/CBC/PKCS5Padding";/**
     * 功能描述: 128-32位16进制;256-64位16进制
     */publicstaticfinalint DEFAULT_KEY_SIZE =128;/**
     * 功能描述: 测试
     * @author zhang pu
     * @date 10:31 2022/9/13
     */publicstaticvoidmain(String[] args)throwsException{String s =generateKeyString();System.out.println("密钥:"+s);String uuid= UUID.randomUUID().toString();System.out.println("带加密数据:"+uuid);//sm4对称加密String s1 =encryptTextSm4(s, uuid);System.out.println("加密数据:"+s1);String s2 =decodeTextSm4(s, s1);System.out.println("解密数据:"+s2);//sm3加密String s3 =encryptTextSm3(uuid);System.out.println(verify(uuid,s3));}/**
     * 功能描述: sm4加密 加密模式:CBC
     * 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位
     * @author zhang pu
     * @date 10:31 2022/9/13
     * @param hexKey   16进制密钥(忽略大小写)
     * @param paramStr 待加密字符串
     * 返回16进制的加密字符串
     */publicstaticStringencryptTextSm4(String hexKey,String paramStr)throwsException{String result ="";// 16进制字符串-->byte[]byte[] keyData =ByteUtils.fromHexString(hexKey);// String-->byte[]byte[] srcData = paramStr.getBytes(ENCODING);// 加密后的数组byte[] cipherArray =encrypt_Cbc_Padding(keyData, srcData);// byte[]-->hexString
        result =ByteUtils.toHexString(cipherArray);return result;}/**
     * 功能描述: sm4解密 解密模式:采用CBC
     * @author zhang pu
     * @date 10:31 2022/9/13
     * @param hexKey 16进制密钥
     * @param text   16进制的加密字符串(忽略大小写)
     */publicstaticStringdecodeTextSm4(String hexKey,String text)throwsException{String result ="";byte[] keyData =ByteUtils.fromHexString(hexKey);byte[] resultData =ByteUtils.fromHexString(text);// 解密byte[] srcData =decrypt_Cbc_Padding(keyData, resultData);
        result =newString(srcData, ENCODING);return result;}/**
     * 功能描述: sm3加密
     * 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
     * @author zhang pu
     * @date 10:39 2022/9/13
     * @param text  内容
     */publicstaticStringencryptTextSm3(String text)throwsUnsupportedEncodingException{byte[] bytes = text.getBytes(ENCODING);byte[] hash =hash(bytes);String s =ByteUtils.toHexString(hash);return s;}publicstaticbyte[]hash(byte[] srcData){SM3Digest digest=newSM3Digest();
        digest.update(srcData,0,srcData.length);byte[] bytes =newbyte[digest.getDigestSize()];
        digest.doFinal(bytes,0);return bytes;}/**
     * 功能描述:判断元数据与加密数据是否一致
     * @author zhang pu
     * @date 10:56 2022/9/13
     * 参数 srcStr  元数据
     * 参数 sm3HexString 加密过的数据
     */publicstaticbooleanverify(String srcStr,String sm3HexString)throwsException{boolean flag=false;byte[] srcStrData = srcStr.getBytes(ENCODING);byte[] sm3HexStringData =ByteUtils.fromHexString(sm3HexString);byte[] hash =hash(srcStrData);if(Arrays.equals(hash,sm3HexStringData)){
            flag=true;}return flag;}/**
     * 功能描述: 生成密钥
     * @author zhang pu
     * @date 10:30 2022/9/13
     */publicstaticStringgenerateKeyString()throwsException{KeyGenerator kg =KeyGenerator.getInstance(ALGORITHM_NAME,BouncyCastleProvider.PROVIDER_NAME);
        kg.init(DEFAULT_KEY_SIZE,newSecureRandom());byte[] encoded = kg.generateKey().getEncoded();returnByteUtils.toHexString(encoded);}/**
     * 加密模式之CBC
     * @param key
     * @param data
     * @return
     * @throws Exception
     * @explain
     */publicstaticbyte[]encrypt_Cbc_Padding(byte[] key,byte[] data)throwsException{Cipher cipher =generateCbcCipher(ALGORITHM_NAME_CBC_PADDING,Cipher.ENCRYPT_MODE, key);return cipher.doFinal(data);}privatestaticCiphergenerateCbcCipher(String algorithmName,int mode,byte[] key)throwsException{Cipher cipher =Cipher.getInstance(algorithmName,BouncyCastleProvider.PROVIDER_NAME);Key sm4Key =newSecretKeySpec(key, ALGORITHM_NAME);
        cipher.init(mode, sm4Key,generateIV());return cipher;}/**
     * 功能描述: 初始化算法参数
     * @author zhang pu
     * @date 10:33 2022/9/13
     */publicstaticAlgorithmParametersgenerateIV()throwsException{byte[] iv =newbyte[16];//设置数据全为0Arrays.fill(iv,(byte)0x00);AlgorithmParameters params =AlgorithmParameters.getInstance(ALGORITHM_NAME);
        params.init(newIvParameterSpec(iv));return params;}/**
     * 功能描述: cbc模式解密
     * @author zhang pu
     * @date 10:33 2022/9/13
     */publicstaticbyte[]decrypt_Cbc_Padding(byte[] key,byte[] cipherText)throwsException{Cipher cipher =generateCbcCipher(ALGORITHM_NAME_CBC_PADDING,Cipher.DECRYPT_MODE, key);return cipher.doFinal(cipherText);}}
标签: java 前端 jvm

本文转载自: https://blog.csdn.net/weixin_42456784/article/details/126829928
版权归原作者 村东头老张 所有, 如有侵权,请联系我们删除。

“java实现国产SM3、SM4加密”的评论:

还没有评论