DES&数据指纹

 

一 ,MessageDigest MD5(信息-摘要算法5)和 SHA(安全哈希算法) 区别

跳转收银台,使用数据指纹
String payUrl = cashier_url + MapUtil.createLinkString(parmMap) + "&sign_type=SHA-256&sign=" + sign; sign_type=SHA-256&sign=58e102c13bc4c643ba6619a600ea6060788c522298da367ce6c70b42dc0a6634

1,SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的hash函数算法,也是目前最先进的加密技术,而SHA-1基于MD5,MD5又基于MD4
2,MD5和SHA-1是单项散列函数的典型代表,它们广泛地应用在信息安全和数字签名等各个领域。从而有效地抗击了信息的主动式攻击
两者比较:
(1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
(2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
(3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

 

二,对称加密,加密解密秘钥相同

AES:Advanced Encrytion Standard(高级加密标准)
DES:Data Encrytion Standard(数据加密标准),对应算法是DEA

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


import org.apache.commons.lang3.ArrayUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.digests.ShortenedDigest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.Strings;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.Security;

public class DesTest {
    public static final ExtendedDigest SHA1_20 = new SHA1Digest();
    public static final ExtendedDigest SHA1_08 = new ShortenedDigest(SHA1_20, 8);

    static {
        setup();
    }
    private static final void setup() {
        if (Security.getProvider("BC") == null) {
            try {
                Security.addProvider(new BouncyCastleProvider());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @org.junit.Test
    public void encryt(){
        String content = "123456asdfghjkqwer234er";
        String password = "pajkxOrderService20180403";
        byte[] decrypted = Strings.toUTF8ByteArray(content);
        byte[] mark = {'d', 'c', 'p'};
        byte[] input = new byte[decrypted.length + mark.length];
        System.arraycopy(mark, 0, input, 0, mark.length);
        System.arraycopy(decrypted, 0, input, mark.length, decrypted.length);

        byte[] encrypted = encrytOrDecryt(password, input,Cipher.ENCRYPT_MODE);
        String result = Strings.fromUTF8ByteArray(Base64.encode(encrypted));
        System.out.println("result:" + result);
    }

    @org.junit.Test
    public void decryt(){
        String content = "123456asdfghjkqwer234er";
        String password = "pajkxOrderService20180403";
        byte[] mark = {'d', 'c', 'p'};

        String token = "TqoaUyZ6o+qqQXLmNq0JAPUtbxNud7n+Aqq3LhW4wfA=";
        byte[] encrypted = Base64.decode(Strings.toUTF8ByteArray(token));
        byte[] decrypted = encrytOrDecryt( password, encrypted,Cipher.DECRYPT_MODE);
        byte[] output = ArrayUtils.subarray(decrypted, mark.length, decrypted.length);
        String result = Strings.fromUTF8ByteArray(output);
        System.out.println("result111:" + result);
    }

    public static final byte[] encrytOrDecryt(String password, byte[] decrypted,int mode) {
        Cipher cipher = null; //可以缓存起来
        try {
            cipher = Cipher.getInstance("DES", "BC");
        } catch (Exception e) {
            e.printStackTrace();
        }

        Key key = null;
        Digest digest = SHA1_08;
        key = new SecretKeySpec(hmac1(digest, password), "DES");//可以缓存

        IvParameterSpec iv = new IvParameterSpec(hmac1(digest, password)); //可以缓存

        synchronized (cipher) {
            try {
                cipher.init(mode, key, iv);//Cipher.DECRYPT_MODE 用于解密
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            try {
                return cipher.doFinal(decrypted);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }
    }

    private static final byte[] hmac1(Digest digest, String string) {
        byte[] hmac = new byte[digest.getDigestSize()];
        byte[] data = Strings.toUTF8ByteArray(string);
        synchronized(digest) {
            HMac h = new HMac(digest);
            h.update(data, 0, data.length);
            h.doFinal(hmac, 0);
            digest.reset();
        }
        return hmac;
    }

}

  

 

posted @ 2021-10-16 16:33  XUMT111  阅读(83)  评论(0编辑  收藏  举报