更多精彩内容,欢迎关注:

视频号
视频号

抖音
抖音

快手
快手

微博
微博

java sm3加密

文档

java sm3加密

java sm3加密是一种加密算法。Sm3算法是我国自己设计的哈希算法,作用主要是数字签名及验证、消息认证、随机数产生等。Sm3算法的运行过程如下:1、使填充后的数据长度是512的整数倍。2、把填充后的信息按照512比特进行分组。3、迭代压缩得到最后的哈希值。
推荐度:
导读java sm3加密是一种加密算法。Sm3算法是我国自己设计的哈希算法,作用主要是数字签名及验证、消息认证、随机数产生等。Sm3算法的运行过程如下:1、使填充后的数据长度是512的整数倍。2、把填充后的信息按照512比特进行分组。3、迭代压缩得到最后的哈希值。

   

java sm3加密是什么?让我们一起来了解一下吧!

java sm3加密是一种加密算法。Sm3算法是我国自己设计的哈希算法,在商用密码体系当中,sm3算法的作用主要是数字签名及验证、消息认证、随机数产生等。Sm3算法是公开的,进行加密会产生一个32字节的值。

Sm3算法的运行过程如下:

1.填充:使填充后的数据的长度是512的整数倍

2.进行分组:把填充后的信息按照512比特一个分组进行分组。

3.迭代压缩得到最后的哈希值:如果信息分为N组,那么IV(N)就是最后得到的杂凑值。

java中采用sm3算法加密代码如下:

public class SM3 {
 
    public static final byte[] iv = { 0x73, (byte) 0x80, 0x16, 0x6f, 0x49,
            0x14, (byte) 0xb2, (byte) 0xb9, 0x17, 0x24, 0x42, (byte) 0xd7,
            (byte) 0xda, (byte) 0x8a, 0x06, 0x00, (byte) 0xa9, 0x6f, 0x30,
            (byte) 0xbc, (byte) 0x16, 0x31, 0x38, (byte) 0xaa, (byte) 0xe3,
            (byte) 0x8d, (byte) 0xee, 0x4d, (byte) 0xb0, (byte) 0xfb, 0x0e,
            0x4e };
 
    public static int[] Tj = new int[64];
 
    static
    {
        for (int i = 0; i < 16; i++)
        {
            Tj[i] = 0x79cc4519;
        }
 
        for (int i = 16; i < 64; i++)
        {
            Tj[i] = 0x7a879d8a;
        }
    }
 
    public static byte[] CF(byte[] V, byte[] B)
    {
        int[] v, b;
        v = convert(V);
        b = convert(B);
        return convert(CF(v, b));
    }
 
    private static int[] convert(byte[] arr)
    {
        int[] out = new int[arr.length / 4];
        byte[] tmp = new byte[4];
        for (int i = 0; i < arr.length; i += 4)
        {
            System.arraycopy(arr, i, tmp, 0, 4);
            out[i / 4] = bigEndianByteToInt(tmp);
        }
        return out;
    }
 
    private static byte[] convert(int[] arr)
    {
        byte[] out = new byte[arr.length * 4];
        byte[] tmp = null;
        for (int i = 0; i < arr.length; i++)
        {
            tmp = bigEndianIntToByte(arr[i]);
            System.arraycopy(tmp, 0, out, i * 4, 4);
        }
        return out;
    }
 
    public static int[] CF(int[] V, int[] B)
    {
        int a, b, c, d, e, f, g, h;
        int ss1, ss2, tt1, tt2;
        a = V[0];
        b = V[1];
        c = V[2];
        d = V[3];
        e = V[4];
        f = V[5];
        g = V[6];
        h = V[7];
 
        /*System.out.println("IV: ");
        System.out.print(Integer.toHexString(a)+" ");
        System.out.print(Integer.toHexString(b)+" ");
        System.out.print(Integer.toHexString(c)+" ");
        System.out.print(Integer.toHexString(d)+" ");
        System.out.print(Integer.toHexString(e)+" ");
        System.out.print(Integer.toHexString(f)+" ");
        System.out.print(Integer.toHexString(g)+" ");
        System.out.print(Integer.toHexString(h)+" ");
        System.out.println("");
        System.out.println("");
 
        System.out.println("填充后的消息: ");
        for(int i=0; i= 0 && j = 0 && j <= 15)
        {
            return GG1j(X, Y, Z);
        }
        else
        {
            return GG2j(X, Y, Z);
        }
    }
 
    // 逻辑位运算函数
    private static int FF1j(int X, int Y, int Z)
    {
        int tmp = X ^ Y ^ Z;
        return tmp;
    }
 
    private static int FF2j(int X, int Y, int Z)
    {
        int tmp = ((X & Y) | (X & Z) | (Y & Z));
        return tmp;
    }
 
    private static int GG1j(int X, int Y, int Z)
    {
        int tmp = X ^ Y ^ Z;
        return tmp;
    }
 
    private static int GG2j(int X, int Y, int Z)
    {
        int tmp = (X & Y) | (~X & Z);
        return tmp;
    }
 
    private static int P0(int X)
    {
        int y = rotateLeft(X, 9);
        y = bitCycleLeft(X, 9);
        int z = rotateLeft(X, 17);
        z = bitCycleLeft(X, 17);
        int t = X ^ y ^ z;
        return t;
    }
 
    private static int P1(int X)
    {
        int t = X ^ bitCycleLeft(X, 15) ^ bitCycleLeft(X, 23);
        return t;
    }
 
    /**
     * 对最后一个分组字节数据padding
     *
     * @param in
     * @param bLen
     *            分组个数
     * @return
     */
    public static byte[] padding(byte[] in, int bLen)
    {
        int k = 448 - (8 * in.length + 1) % 512;
        if (k < 0)
        {
            k = 960 - (8 * in.length + 1) % 512;
        }
        k += 1;
        byte[] padd = new byte[k / 8];
        padd[0] = (byte) 0x80;
        long n = in.length * 8 + bLen * 512;
        byte[] out = new byte[in.length + k / 8 + 64 / 8];
        int pos = 0;
        System.arraycopy(in, 0, out, 0, in.length);
        pos += in.length;
        System.arraycopy(padd, 0, out, pos, padd.length);
        pos += padd.length;
        byte[] tmp = back(Util.longToBytes(n));
        System.arraycopy(tmp, 0, out, pos, tmp.length);
        return out;
    }
 
    /**
     * 字节数组逆序
     *
     * @param in
     * @return
     */
    private static byte[] back(byte[] in)
    {
        byte[] out = new byte[in.length];
        for (int i = 0; i < out.length; i++)
        {
            out[i] = in[out.length - i - 1];
        }
 
        return out;
    }
 
    public static int rotateLeft(int x, int n)
    {
        return (x << n) | (x >> (32 - n));
    }
 
    private static int bitCycleLeft(int n, int bitLen)
    {
        bitLen %= 32;
        byte[] tmp = bigEndianIntToByte(n);
        int byteLen = bitLen / 8;
        int len = bitLen % 8;
        if (byteLen > 0)
        {
            tmp = byteCycleLeft(tmp, byteLen);
        }
 
        if (len > 0)
        {
            tmp = bitSmall8CycleLeft(tmp, len);
        }
 
        return bigEndianByteToInt(tmp);
    }
 
    private static byte[] bitSmall8CycleLeft(byte[] in, int len)
    {
        byte[] tmp = new byte[in.length];
        int t1, t2, t3;
        for (int i = 0; i < tmp.length; i++)
        {
            t1 = (byte) ((in[i] & 0x000000ff) << len);
            t2 = (byte) ((in[(i + 1) % tmp.length] & 0x000000ff) >> (8 - len));
            t3 = (byte) (t1 | t2);
            tmp[i] = (byte) t3;
        }
 
        return tmp;
    }
 
    private static byte[] byteCycleLeft(byte[] in, int byteLen)
    {
        byte[] tmp = new byte[in.length];
        System.arraycopy(in, byteLen, tmp, 0, in.length - byteLen);
        System.arraycopy(in, 0, tmp, in.length - byteLen, byteLen);
        return tmp;
    }
 
    /*private static void print(int[] arr)
    {
        for (int i = 0; i < arr.length; i++)
        {
            System.out.print(Integer.toHexString(arr[i]) + " ");
            if ((i + 1) % 16 == 0)
            {
                System.out.println();
            }
        }
        System.out.println();
    }*/
}

以上就是小编今天的分享了,希望可以帮助到大家。

文档

java sm3加密

java sm3加密是一种加密算法。Sm3算法是我国自己设计的哈希算法,作用主要是数字签名及验证、消息认证、随机数产生等。Sm3算法的运行过程如下:1、使填充后的数据长度是512的整数倍。2、把填充后的信息按照512比特进行分组。3、迭代压缩得到最后的哈希值。
推荐度:
为你推荐
资讯专栏
热门视频
相关推荐
文章千古事得失寸心知是谁的名句 诚信的名言名句 关于读书的名言名句 生日的经典名句 感恩老师的名言名句 关于时间的名言名句 活着的经典名句 java snappy 杜甫的名句 java snapshot 孟浩然的名句 关于诚信的名言名句 杜甫的名言名句 杜甫的名句有哪些 杜甫的千古名句 范仲淹的名句 范仲淹的十大经典名句 缅怀先烈的名言名句 坚持的名言名句 屈原的名言名句 java sizeof java simpledateformat java simhash java shuffle java sha256加密 java portal java pojo java plugin java sftp java plug-in java settimeout java platform java setlayout java serialversionuid java serializable接口 java serializable java sequence java separator java semaphore java selenium
Top