精华内容
下载资源
问答
  • 2022-03-04 14:48:47
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import java.nio.charset.StandardCharsets;
    import java.security.Key;
    import java.security.Security;
    import java.util.Arrays;
    import java.util.Base64;
    import java.util.Base64.Encoder;
    import java.util.Base64.Decoder;
    
    /**
     * Copyright (C), 2010-2021
     * Description:
     *
     * @author fangliu
     * @version 1.0.0
     * @date 2021/10/28 14:54
     */
    public class Sm4Utils {
    
        static {
            Security.addProvider(new BouncyCastleProvider());
        }
    
        private static final String ENCODING = "UTF-8";
    
        public static final String ALGORITHM_NAME = "SM4";
    
        // 加密算法/分组加密模式/分组填充方式
        // PKCS5Padding-以8个字节为一组进行分组加密
        // 定义分组加密模式使用:PKCS5Padding
        public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";
    
        // 128-32位16进制;256-64位16进制
        public static final int DEFAULT_KEY_SIZE = 128;
    
        private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
            Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
            Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
            cipher.init(mode, sm4Key);
            return cipher;
        }
    
        public static String encryptEcb(byte[] hexKey, String paramStr) throws Exception {
            String cipherText = null;
            byte[] keyData = hexKey;
            byte[] srcData = paramStr.getBytes(ENCODING);
            byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);
            cipherText = Base64.getEncoder().encodeToString(cipherArray);
            return cipherText;
        }
    
        public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {
            Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);
            return cipher.doFinal(data);
        }
    
        public static String decryptEcb(byte[] hexKey, String cipherText) throws Exception {
            String decryptStr = "";
            byte[] keyData = hexKey;
            byte[] cipherData = Base64.getDecoder().decode(cipherText);
            byte[] srcData = decrypt_Ecb_Padding(keyData, cipherData);
            decryptStr = new String(srcData, ENCODING);
            return decryptStr;
        }
    
        public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {
            Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);
            return cipher.doFinal(cipherText);
        }
    
        public static boolean verifyEcb(byte[] hexKey, String cipherText, String paramStr) throws Exception {
            boolean flag = false;
            byte[] keyData = hexKey;
            byte[] cipherData = Base64.getDecoder().decode(cipherText);
            byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData);
            byte[] srcData = paramStr.getBytes(ENCODING);
            flag = Arrays.equals(decryptData, srcData);
            return flag;
        }
    
        public static void main(String[] args) throws Exception {
            String data = "张三";
            byte[] keys = "密钥".getBytes(StandardCharsets.UTF_8);
            Encoder encoder = Base64.getEncoder();
            String encode = encoder.encodeToString(encrypt_Ecb_Padding(keys, data.getBytes()));
            System.out.println("加密结果2:" + encode);
            Decoder decoder = Base64.getDecoder();
            String decrypt = new String(decrypt_Ecb_Padding(keys, decoder.decode(encode)));
            System.out.println("解密结果2:" + decrypt);
        }
    }

    更多相关内容
  • sm2、sm4国密加密算法java实现 可自行验证是否是你需要的sm2加密算法 私钥:BF1F907B4E0487F798DC80AFD7BC2A6201E8514233002272EA3BE2FC6F797843 公钥:前缀04+x坐标+y坐标 042DBA45E7B03394F603CADAFCDDEC854D3E01...
  • sm4 cbc/ecb 加密解密算法c语言实现,适用于windows/linux平台,测试有效
  • SM4加密

    2021-10-21 16:00:33
    SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。相关标准为“GM/T 0002-2012《SM4分组密码算法》(原SMS4分组密码算法)”。

    版本:jdk1.8
    Maven依赖:

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.5.4</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15to18</artifactId>
        <version>1.66</version>
    </dependency>
    
    

    版本:jdk1.7
    Maven依赖:

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.6.17</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15to18</artifactId>
        <version>1.63</version>
    </dependency>
    
    

    代码示例:

    import cn.hutool.core.util.CharsetUtil;
    import cn.hutool.crypto.SmUtil;
    import cn.hutool.crypto.symmetric.SymmetricCrypto;
    
    import java.nio.charset.StandardCharsets;
    
    public class Main {
        /**
         * 加密
         *
         * @param msg
         * @return
         */
        public static String encrypt(String key,String msg) {
            SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes(StandardCharsets.UTF_8));
            //加密
            String encryptHex = sm4.encryptHex(msg);
            return encryptHex;
        }
    
        /**
         * 解密
         * @param key
         * @param msg
         * @return
         */
        public static String dencrypt(String key,String msg){
            SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes(StandardCharsets.UTF_8));
            //解密
            String decryptStr = sm4.decryptStr(msg, CharsetUtil.CHARSET_UTF_8);
            return decryptStr;
        }
    
        public static void main(String[] args) {
            // key必须是16位
            String key="1234567890123456";
            String name = "fisco bcos";
            name = Main.encrypt(key,name);
            System.out.println(name);
            System.out.println(Main.dencrypt(key,name));
        }
    }
    

    控制台输出:
    在这里插入图片描述

    展开全文
  • sm4加密,解密java工具

    千次阅读 2021-03-03 13:40:20
    sm4加密,解密java工具类 最近项目中和第三方接口对接,客户方需要采用sm4加密,故上网研究了下,但是没有找到好用的工具类,所以我整理了一份,供参考,亲测有效。 前提:需要添加maven 依赖 <dependency> ...

    sm4加密,解密java工具类

    最近项目中和第三方接口对接,客户方需要采用sm4加密,故上网研究了下,但是没有找到好用的工具类,所以我整理了一份,供参考,亲测有效。
    前提:需要添加maven 依赖

            <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.66</version>
            </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.1</version>
        </dependency>
    

    代码:

    public class Sm4Util {
    static {
        Security.addProvider(new BouncyCastleProvider());
    }
    
    private static final String ENCODING = "UTF-8";
    public static final String ALGORITHM_NAME = "SM4";
    
    //加密算法/分组加密模式/分组填充方式
    //PKCS5Padding-以8个字节为一组分组加密
    //定义分组加密模式使用:PKCS5Padding
    
    public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";
    
    //128-32位16进制;256-64位16进制
    
    public static final int DEFAULT_KEY_SIZE = 128;
    
    /**
     * 生成ECB暗号
     *
     * @param algorithmName 算法名称
     * @param mode          模式
     * @param key
     * @return
     * @throws Exception
     * @explain ECB模式(电子密码本模式:Electronic codebook)
     */
    private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
        Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
        cipher.init(mode, sm4Key);
        return cipher;
    }
    
    public static byte[] generateKey() throws Exception {
        return generateKey(DEFAULT_KEY_SIZE);
    }
    
    public static byte[] generateKey(int keySize) throws Exception {
        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);
        kg.init(keySize, new SecureRandom());
        return kg.generateKey().getEncoded();
    }
    
    /**
     * sm4加密
     *
     * @param hexKey   16进制秘钥(忽略大小写)
     * @param paramStr 待加密字符串
     * @return 返回16进制的加密字符串
     * @throws Exception
     */
    public static String encryptEcb(String hexKey, String paramStr) throws Exception {
        String cipherText = "";
        // 16进制字符串-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // String-->byte[]
        byte[] srcData = paramStr.getBytes(ENCODING);
        // 加密后的数组
        byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);
        // byte[]-->hexString
        cipherText = ByteUtils.toHexString(cipherArray);
        return cipherText;
    }
    
    /**
     * 加密模式之Ecb
     *
     * @param key
     * @param data
     * @return
     * @throws Exception
     * @explain
     */
    public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {
        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(data);
    }
    
    /**
     * sm4解密
     *
     * @param hexKey     16进制密钥
     * @param cipherText 16进制的加密字符串(忽略大小写)
     * @return 解密后的字符串
     * @throws Exception
     * @explain 解密模式:采用ECB
     */
    public static String decryptEcb(String hexKey, String cipherText) throws Exception {
        // 用于接收解密后的字符串
        String decryptStr = "";
        // hexString-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // hexString-->byte[]
        byte[] cipherData = ByteUtils.fromHexString(cipherText);
        // 解密
        byte[] srcData = decrypt_Ecb_Padding(keyData, cipherData);
        // byte[]-->String
        decryptStr = new String(srcData, ENCODING);
        return decryptStr;
    }
    
    /**
     * @param key
     * @param cipherText
     * @return
     * @throws Exception
     */
    public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {
    
        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(cipherText);
    }
    
    /**
     * 校验加密前后的字符串是否为同一数据
     *
     * @param hexKey     16进制密钥(忽略大小写)
     * @param cipherText 16进制加密后的字符串
     * @param paramStr   加密前的字符串
     * @return 是否为同一数据
     * @throws Exception
     * @explain
     */
    public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception{
        // 用于接收校验结果
        boolean flag = false;
        // hexString-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // 将16进制字符串转换成数组
        byte[] cipherData = ByteUtils.fromHexString(cipherText);
        // 解密
        byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData);
        // 将原字符串转换成byte[]
        byte[] srcData = paramStr.getBytes(ENCODING);
        // 判断2个数组是否一致
        flag = Arrays.equals(decryptData, srcData);
        return flag;
    }
    
    
    public static void main(String[] args) throws Exception {
        String key = "86C63180C2806ED1F47B859DE501215B";
        String s = "QAZXSWEDCVFR";
        String jiami = Sm4Util.encryptEcb(key, s);
        System.out.println("加密====" + jiami);
        String jiemi = Sm4Util.decryptEcb(key, jiami);
        System.out.println("解密====" + jiemi);
        byte[] bs = ByteUtils.fromHexString(key);
        System.out.println(Arrays.toString(bs));
        System.out.println(ByteUtils.toHexString(generateKey()));
    
        String str = "86C63180C2806ED1F47B859DE501215B";
        int byte_len = str.getBytes("utf-8").length;
        int len = str.length();
        System.out.println("字节长度为:" + byte_len);
        System.out.println("字符长度为:" + len);
        System.out.println("系统默认编码方式:" + System.getProperty("file.encoding"));
    
    }
    
    展开全文
  • 国密SM4加密算法工具类(可逆)

    千次阅读 2020-04-30 15:35:12
    * 国密SM4 * * @author Luke-lee */ public class SM4Util { private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8}; private static final String CODE_UTF8 = "UTF-8"; private static final S...
    /**
     * 国密SM4
     *
     * @author Luke-lee
     */
    public class SM4Util {
    
        private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};
        private static final String CODE_UTF8 = "UTF-8";
        private static final String PASSWORD_CRYPT_KEY = "CSSssDes";
        private static final String KEY_ = "LUKE018YfzXjGB81";
        private static final int ROUND = 32;
        private static final int ENCRYPT = 1;
        private static final int DECRYPT = 0;
        private static final int BLOCK = 16;
    
        private byte[] Sbox = {(byte) 0xd6, (byte) 0x90, (byte) 0xe9, (byte) 0xfe, (byte) 0xcc, (byte) 0xe1, 0x3d,
                (byte) 0xb7, 0x16, (byte) 0xb6, 0x14, (byte) 0xc2, 0x28, (byte) 0xfb, 0x2c, 0x05, 0x2b, 0x67, (byte) 0x9a,
                0x76, 0x2a, (byte) 0xbe, 0x04, (byte) 0xc3, (byte) 0xaa, 0x44, 0x13, 0x26, 0x49, (byte) 0x86, 0x06,
                (byte) 0x99, (byte) 0x9c, 0x42, 0x50, (byte) 0xf4, (byte) 0x91, (byte) 0xef, (byte) 0x98, 0x7a, 0x33, 0x54,
                0x0b, 0x43, (byte) 0xed, (byte) 0xcf, (byte) 0xac, 0x62, (byte) 0xe4, (byte) 0xb3, 0x1c, (byte) 0xa9,
                (byte) 0xc9, 0x08, (byte) 0xe8, (byte) 0x95, (byte) 0x80, (byte) 0xdf, (byte) 0x94, (byte) 0xfa, 0x75,
                (byte) 0x8f, 0x3f, (byte) 0xa6, 0x47, 0x07, (byte) 0xa7, (byte) 0xfc, (byte) 0xf3, 0x73, 0x17, (byte) 0xba,
                (byte) 0x83, 0x59, 0x3c, 0x19, (byte) 0xe6, (byte) 0x85, 0x4f, (byte) 0xa8, 0x68, 0x6b, (byte) 0x81,
                (byte) 0xb2, 0x71, 0x64, (byte) 0xda, (byte) 0x8b, (byte) 0xf8, (byte) 0xeb, 0x0f, 0x4b, 0x70, 0x56,
                (byte) 0x9d, 0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, (byte) 0xd1, (byte) 0xa2, 0x25, 0x22, 0x7c, 0x3b,
                0x01, 0x21, 0x78, (byte) 0x87, (byte) 0xd4, 0x00, 0x46, 0x57, (byte) 0x9f, (byte) 0xd3, 0x27, 0x52, 0x4c,
                0x36, 0x02, (byte) 0xe7, (byte) 0xa0, (byte) 0xc4, (byte) 0xc8, (byte) 0x9e, (byte) 0xea, (byte) 0xbf,
                (byte) 0x8a, (byte) 0xd2, 0x40, (byte) 0xc7, 0x38, (byte) 0xb5, (byte) 0xa3, (byte) 0xf7, (byte) 0xf2,
                (byte) 0xce, (byte) 0xf9, 0x61, 0x15, (byte) 0xa1, (byte) 0xe0, (byte) 0xae, 0x5d, (byte) 0xa4, (byte) 0x9b,
                0x34, 0x1a, 0x55, (byte) 0xad, (byte) 0x93, 0x32, 0x30, (byte) 0xf5, (byte) 0x8c, (byte) 0xb1, (byte) 0xe3,
                0x1d, (byte) 0xf6, (byte) 0xe2, 0x2e, (byte) 0x82, 0x66, (byte) 0xca, 0x60, (byte) 0xc0, 0x29, 0x23,
                (byte) 0xab, 0x0d, 0x53, 0x4e, 0x6f, (byte) 0xd5, (byte) 0xdb, 0x37, 0x45, (byte) 0xde, (byte) 0xfd,
                (byte) 0x8e, 0x2f, 0x03, (byte) 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, (byte) 0x8d, 0x1b, (byte) 0xaf,
                (byte) 0x92, (byte) 0xbb, (byte) 0xdd, (byte) 0xbc, 0x7f, 0x11, (byte) 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a,
                (byte) 0xd8, 0x0a, (byte) 0xc1, 0x31, (byte) 0x88, (byte) 0xa5, (byte) 0xcd, 0x7b, (byte) 0xbd, 0x2d, 0x74,
                (byte) 0xd0, 0x12, (byte) 0xb8, (byte) 0xe5, (byte) 0xb4, (byte) 0xb0, (byte) 0x89, 0x69, (byte) 0x97, 0x4a,
                0x0c, (byte) 0x96, 0x77, 0x7e, 0x65, (byte) 0xb9, (byte) 0xf1, 0x09, (byte) 0xc5, 0x6e, (byte) 0xc6,
                (byte) 0x84, 0x18, (byte) 0xf0, 0x7d, (byte) 0xec, 0x3a, (byte) 0xdc, 0x4d, 0x20, 0x79, (byte) 0xee, 0x5f,
                0x3e, (byte) 0xd7, (byte) 0xcb, 0x39, 0x48};
        private int[] CK = {0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
                0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, 0xc0c7ced5,
                0xdce3eaf1, 0xf8ff060d, 0x141b2229, 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, 0xa0a7aeb5, 0xbcc3cad1,
                0xd8dfe6ed, 0xf4fb0209, 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279};
    
        public static String encodeSMS4(String plaintext) throws Exception {
            return SM4Util.encodeSMS4(plaintext, null);
        }
    
        public static String encodeSMS4(String plaintext, String key) throws Exception {
            if (!StringUtils.hasText(plaintext)) {
                return null;
            }
            byte[] b = encryptDES(plaintext).getBytes(CODE_UTF8);
            byte[] rstr = SM4Util.encodeSMS4(b, key);
            return ConvertUtil.byteToHex(rstr);
        }
    
        /**
         * 不限明文长度的SMS4加密
         *
         * @param plaintext
         * @param key
         * @return
         */
        private static byte[] encodeSMS4(byte[] plaintext, String key) {
            byte[] ciphertext = new byte[plaintext.length];
            int k = 0;
            int plainLen = plaintext.length;
            while (k + 16 <= plainLen) {
                byte[] cellPlain = new byte[16];
                System.arraycopy(plaintext, k, cellPlain, 0, 16);
                byte[] cellCipher = encode16(cellPlain, key);
                System.arraycopy(cellCipher, 0, ciphertext, k, cellCipher.length);
                k += 16;
            }
            return ciphertext;
        }
    
        /**
         * 不限明文长度的SMS4解密
         *
         * @param ciphertext
         * @param key
         * @return
         */
        private static byte[] decodeSMS4(byte[] ciphertext, String key) {
            byte[] plaintext = new byte[ciphertext.length];
            int k = 0;
            int cipherLen = ciphertext.length;
            while (k + 16 <= cipherLen) {
                byte[] cellCipher = new byte[16];
                System.arraycopy(ciphertext, k, cellCipher, 0, 16);
                byte[] cellPlain = decode16(cellCipher, key);
                System.arraycopy(cellPlain, 0, plaintext, k, cellPlain.length);
                k += 16;
            }
            return plaintext;
        }
    
        /**
         * 解密,获得明文字符串
         *
         * @param ciphertext 内容
         * @param code       编码
         * @return
         */
        public static String decodeSMS4toString(String ciphertext, String code) throws Exception {
            if (!StringUtils.hasText(ciphertext)) {
                return null;
            }
            byte[] bytes = ConvertUtil.hexStringToBytes(ciphertext);
            byte[] plaintext = decodeSMS4(bytes, KEY_);
    
            return decryptDES(plaintext, code);
        }
    
        /**
         * 解密,获得明文字符串
         *
         * @param ciphertext 内容
         * @param key        秘钥
         * @param code       编码
         * @return
         */
        public static String decodeSMS4toString(String ciphertext, String key, String code) throws Exception {
            if (!StringUtils.hasText(ciphertext)) {
                return null;
            }
            byte[] bytes = ConvertUtil.hexStringToBytes(ciphertext);
            byte[] plaintext = decodeSMS4(bytes, key);
    
            return decryptDES(plaintext, code);
        }
    
        private static byte[] encode16(byte[] plaintext, String key) {
            byte[] key_ = null;
            if (!StringUtils.hasText(key)) {
                key_ = KEY_.getBytes();
            } else {
                key_ = key.getBytes();
            }
    
            byte[] cipher = new byte[16];
            SM4Util sm4 = new SM4Util();
            sm4.sms4(plaintext, 16, key_, cipher, ENCRYPT);
            return cipher;
        }
    
        /**
         * 只加密16位明文
         *
         * @param plaintext
         * @param key
         * @return
         */
        private static byte[] x(byte[] plaintext, String key) {
            byte[] key_ = null;
            if (!StringUtils.hasText(key)) {
                key_ = KEY_.getBytes();
            } else {
                key_ = key.getBytes();
            }
    
            byte[] cipher = new byte[16];
            SM4Util sm4 = new SM4Util();
            sm4.sms4(plaintext, 16, key_, cipher, ENCRYPT);
            return cipher;
        }
    
        /**
         * 只解密16位密文
         *
         * @param ciphertext
         * @param key
         * @return
         */
        private static byte[] decode16(byte[] ciphertext, String key) {
            byte[] plain = new byte[16];
            SM4Util sm4 = new SM4Util();
            sm4.sms4(ciphertext, 16, key.getBytes(), plain, DECRYPT);
            return plain;
        }
    
        private int sms4(byte[] in, int inLen, byte[] key, byte[] out, int CryptFlag) {
            int point = 0;
            int[] round_key = new int[ROUND];
            SMS4KeyExt(key, round_key, CryptFlag);
            byte[] input;
            byte[] output = new byte[16];
    
            while (inLen >= BLOCK) {
                input = Arrays.copyOfRange(in, point, point + 16);
                SMS4Crypt(input, output, round_key);
                System.arraycopy(output, 0, out, point, BLOCK);
                inLen -= BLOCK;
                point += BLOCK;
            }
    
            return 0;
        }
    
        private int Rotl(int x, int y) {
            return x << y | x >>> (32 - y);
        }
    
        private int ByteSub(int A) {
            return (Sbox[A >>> 24 & 0xFF] & 0xFF) << 24 | (Sbox[A >>> 16 & 0xFF] & 0xFF) << 16
                    | (Sbox[A >>> 8 & 0xFF] & 0xFF) << 8 | (Sbox[A & 0xFF] & 0xFF);
        }
    
        private int L1(int B) {
            return B ^ Rotl(B, 2) ^ Rotl(B, 10) ^ Rotl(B, 18) ^ Rotl(B, 24);
        }
    
        private int L2(int B) {
            return B ^ Rotl(B, 13) ^ Rotl(B, 23);
        }
    
        private void SMS4Crypt(byte[] Input, byte[] Output, int[] rk) {
            int r, mid, x0, x1, x2, x3;
            int[] x = new int[4];
            int[] tmp = new int[4];
            for (int i = 0; i < 4; i++) {
                tmp[0] = Input[4 * i] & 0xff;
                tmp[1] = Input[1 + 4 * i] & 0xff;
                tmp[2] = Input[2 + 4 * i] & 0xff;
                tmp[3] = Input[3 + 4 * i] & 0xff;
                x[i] = tmp[0] << 24 | tmp[1] << 16 | tmp[2] << 8 | tmp[3];
            }
            for (r = 0; r < 32; r += 4) {
                mid = x[1] ^ x[2] ^ x[3] ^ rk[r];
                mid = ByteSub(mid);
                x[0] = x[0] ^ L1(mid); // x4
    
                mid = x[2] ^ x[3] ^ x[0] ^ rk[r + 1];
                mid = ByteSub(mid);
                x[1] = x[1] ^ L1(mid); // x5
    
                mid = x[3] ^ x[0] ^ x[1] ^ rk[r + 2];
                mid = ByteSub(mid);
                x[2] = x[2] ^ L1(mid); // x6
    
                mid = x[0] ^ x[1] ^ x[2] ^ rk[r + 3];
                mid = ByteSub(mid);
                x[3] = x[3] ^ L1(mid); // x7
            }
    
            // Reverse
            for (int j = 0; j < 16; j += 4) {
                Output[j] = (byte) (x[3 - j / 4] >>> 24 & 0xFF);
                Output[j + 1] = (byte) (x[3 - j / 4] >>> 16 & 0xFF);
                Output[j + 2] = (byte) (x[3 - j / 4] >>> 8 & 0xFF);
                Output[j + 3] = (byte) (x[3 - j / 4] & 0xFF);
            }
        }
    
        private void SMS4KeyExt(byte[] Key, int[] rk, int CryptFlag) {
            int r, mid;
            int[] x = new int[4];
            int[] tmp = new int[4];
            for (int i = 0; i < 4; i++) {
                tmp[0] = Key[4 * i] & 0xFF;
                tmp[1] = Key[1 + 4 * i] & 0xff;
                tmp[2] = Key[2 + 4 * i] & 0xff;
                tmp[3] = Key[3 + 4 * i] & 0xff;
                x[i] = tmp[0] << 24 | tmp[1] << 16 | tmp[2] << 8 | tmp[3];
            }
            x[0] ^= 0xa3b1bac6;
            x[1] ^= 0x56aa3350;
            x[2] ^= 0x677d9197;
            x[3] ^= 0xb27022dc;
            for (r = 0; r < 32; r += 4) {
                mid = x[1] ^ x[2] ^ x[3] ^ CK[r];
                mid = ByteSub(mid);
                rk[r] = x[0] ^= L2(mid); // rk0=K4
    
                mid = x[2] ^ x[3] ^ x[0] ^ CK[r + 1];
                mid = ByteSub(mid);
                rk[r + 1] = x[1] ^= L2(mid); // rk1=K5
    
                mid = x[3] ^ x[0] ^ x[1] ^ CK[r + 2];
                mid = ByteSub(mid);
                rk[r + 2] = x[2] ^= L2(mid); // rk2=K6
    
                mid = x[0] ^ x[1] ^ x[2] ^ CK[r + 3];
                mid = ByteSub(mid);
                rk[r + 3] = x[3] ^= L2(mid); // rk3=K7
            }
    
            // 解密时轮密钥使用顺序:rk31,rk30,...,rk0
            if (CryptFlag == DECRYPT) {
                for (r = 0; r < 16; r++) {
                    mid = rk[r];
                    rk[r] = rk[31 - r];
                    rk[31 - r] = mid;
                }
            }
        }
    
    
        /**
         * Str转16位
         *
         * @param encryptString
         * @return
         */
        private static String encryptDES(String encryptString) throws Exception {
            IvParameterSpec zeroIv = new IvParameterSpec(iv);
            SecretKeySpec key = new SecretKeySpec(PASSWORD_CRYPT_KEY.getBytes(), "DES");
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
            byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
            String hexString = parseByte2HexStr(encryptedData);
            return hexString;
            // return Base64.encode(encryptedData);
        }
    
        /**
         * 16位转str
         *
         * @param decrypt
         * @param code
         * @return
         */
        private static String decryptDES(byte[] decrypt, String code) throws Exception {
            byte[] byteMi = hex2byte(decrypt);
            IvParameterSpec zeroIv = new IvParameterSpec(iv);
            SecretKeySpec key = new SecretKeySpec(PASSWORD_CRYPT_KEY.getBytes(), "DES");
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
            byte decryptedData[] = cipher.doFinal(byteMi);
            if (!StringUtils.hasText(code)) {
                code = CODE_UTF8;
            }
            return new String(decryptedData, code);
        }
    
        private static String parseByte2HexStr(byte buf[]) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < buf.length; i++) {
                String hex = Integer.toHexString(buf[i] & 0xFF);
                if (hex.length() == 1) {
                    hex = '0' + hex;
                }
                sb.append(hex.toUpperCase());
            }
            return sb.toString();
        }
    
        private static byte[] hex2byte(byte[] b) {
            if ((b.length % 2) != 0) {
                throw new IllegalArgumentException("长度不是偶数");
            }
            byte[] b2 = new byte[b.length / 2];
            for (int n = 0; n < b.length; n += 2) {
                String item = new String(b, n, 2);
                b2[n / 2] = (byte) Integer.parseInt(item, 16);
            }
            return b2;
        }
    
        private SM4Util() {
        }
    }
    
    展开全文
  • } /** * 3DES加密 * * @param key 加密密钥(16字节长度) * @param source 明文 * @return byte[] 密文 */ public static byte[] encrypt3DES(byte[] key, byte[] source) { //初始化加密数据块 byte[] ...
  • C# SM4加密

    2021-08-06 18:15:19
    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading....public static int SM4_ENCRYPT = 1; public static int SM4_DECRYPT = 0; p
  • 基于Java的(SM2_SM3_SM4)国密算法java源代码及工具类,包含测试demo,一件加解密比较方便
  • sm3加密工具类.zip

    2019-12-19 17:29:38
    sm3加密java源码,带jar包,绝对可用 public class Sm3Utils { private final static byte[] hex = "0123456789ABCDEF".getBytes(); /** * @desc SM3加密算法实现方法 * @param data * @return */ ...
  • 前端JS sm4加密解密工具类 操作使用文章访问:https://editor.csdn.net/md/?articleId=107330709
  • SM4加密 使用方法 引用SM4.DLL SM4Utils sm4 = new SM4Utils(); sm4.secretKey = "JeF8U9wHFOMfs2Y8"; sm4.Encrypt_ECB("你好"); /// </summary>
  • 国密SM4加密解密工具

    2018-10-14 20:08:48
    国密加密和解密工具,支持WIN7,WINXP,WIN10,WIN8系统
  • 国密sm4加密、解密Java和js

    千次阅读 2022-01-24 15:15:57
    目录 一、前端 sm4.js 二、Java后端 SM4.java SM4_Context.java Util.java ...SM4Utils.java ...sm4.js ... * 国密SM4加密算法 * @author wzk * @email 1216113487@qq.com * @company 中科软.
  • Sm4【国密4加密解密】实战

    千次阅读 2022-04-11 10:36:17
    由于工作需要使用sm4加密一些个人隐私信息,就研究了一下sm4;感觉它和上章节讲的Rsa(非对称加密)很相似 国密算法SM1-SM4简介 SM1 :为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密...
  • SM4算法是我国制定WAPI标准的组成部分,同时也可以用于其它环境下的数据加密保护。   加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4...
  • 国密sm4加密算法

    千次阅读 2020-04-29 09:21:08
    国密sm4加解密算法工具类,可用于生产环境 package com.example.demo.endecryption.utils; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; import ...
  • sm4前后端加密集成

    2022-04-13 13:43:34
    本文主要用于记录本人在项目中使用的加密解密方法,使用场景是springboot+vue的app项目 JAVA代码 pom文件 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on...
  • /*** 国密SM4** @author Luke-lee*/public class SM4Util {private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};private static final String CODE_UTF8 = "UTF-8";private static final String PASSWORD_CRYPT_...
  • Java SM 国密
  • sm 加密所需要的所有工具都在里面,实现数据的加密解密(记得添加jar包bcprov-jdk16)
  • 实现了sm2加密功能,sm2解密功能,sm2签名功能,sm2验签功能,SM9算法加解密功能,SM9签名验签功能
  • 用于对数据进行SM4加密和解密的小工具,支持自定义secrectkey和iv,免安装,体积小。适用于测试,数据校验等
  • 国密SM4加密解密,亲测可用,方便简单,h5项目+angular+vue项目都可使用。应用简单,调用方便
  • SM4是一种分组密码算法,其分组长度为128位(即16字节,4字),密钥长度也为128位(即16字节,4字)。其加解密过程采用了32轮迭代机制(与DES、AES类似),每一轮需要一个轮密钥(与DES、AES类似)。 1.引入密码...
  • 实现国密SM3算法验证和SM4算法CBC模式下文件加密操作,基于.net环境VS2017开发。
  • 前提操作 搭建客户端和服务端Socket代码实现服务端 和 客户端之间通信_CHYabc123456hh的博客-... 网址如下SM4在线加密SM4在线解密解 国密SM4对称算法 ShangMi - The X 在线工具 通过客户端将密文发送给服务...
  • java sm4国密算法 CBC模式 加解密工具类说明maven依赖生成密钥加密解密测试完整代码最后 说明 工具类最开始是参考这篇博客java sm4国密算法加密、解密,但是该篇博客使用的是EBC模式,所以参考其他文章改成了CBC模式...
  • 作者:bluesbruce来源:SegmentFault 思否社区前言SM4分组密码算法,是由国家密码局发布的国产商用密码算法。...本文SM4的java实现方法,在BC库(bouncycastle)的基础上做了简单的封装,JS方法在sm-crypto的基...
  • java版的sm2、sm3、sm4加密和解密,以及数据转换工具等,比bcd转acd, 字符串转字节数组,数据扩展等方法的。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,857
精华内容 2,342
关键字:

sm4加密工具