日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

加密在平時(shí)開(kāi)發(fā)中也會(huì)經(jīng)常用到,涉及登錄、支付、接口設(shè)計(jì)等方面,可能都需要考慮到加密算法,加密算法分對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密,對(duì)稱(chēng)加密使用的密鑰只有一個(gè),發(fā)送和接收雙方都使用這個(gè)密鑰對(duì)數(shù)據(jù)進(jìn)行加密和解密,非對(duì)稱(chēng)加密算法,需要兩個(gè)密鑰,一個(gè)是公鑰 (public key),另一個(gè)是私鑰 (private key),如果使用公鑰對(duì)數(shù)據(jù) 進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能進(jìn)行解密。如果使用私鑰對(duì)數(shù)據(jù) 進(jìn)行加密,只有用對(duì)應(yīng)的公鑰才能進(jìn)行解密。

 

1、MD5

MD5一般用于對(duì)一段信息產(chǎn)生信息摘要即生成數(shù)字簽名,以防止被篡改。無(wú)論是多長(zhǎng)的輸入,MD5 都會(huì)輸出長(zhǎng)度為128bits 的一個(gè)串 (通常用16進(jìn)制表示為32個(gè)字符)。

JAVA代碼如下:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
public class Md5Utils {
 
    private static final String UTF8 = "utf-8";
 
    /**
     * 加密
     *
     * @param plainText 待加密字符串
     * @return
     */
    public final static String encoder(String plainText)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        byte[] bytes = plainText.getBytes(UTF8);
        MessageDigest mdInst = MessageDigest.getInstance("MD5");
        mdInst.update(bytes);
        byte[] md = mdInst.digest();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < md.length; i++) {
            int val = ((int) md[i]) & 0xff;
            if (val < 16) {
                sb.Append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        return sb.toString();
    }
 
}

 

2、SHA1

SHA1 是和 MD5 一樣流行的 消息摘要算法,然而 SHA1 比 MD5 的 安全性更強(qiáng)。對(duì)于長(zhǎng)度小于 2^64 位的消息,SHA1 會(huì)產(chǎn)生一個(gè) 160 位的消息摘要。基于MD5、SHA1 的信息摘要一般而言不可逆 ,可以被應(yīng)用在檢查 文件完整性以及數(shù)字簽名等場(chǎng)景。

java代碼如下:

import java.security.MessageDigest;
 
public final class Sha1Utils {
    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
 
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文轉(zhuǎn)換成十六進(jìn)制的字符串形式
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }
 
    public static String encode(String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
}

 

3、RSA

RSA 加密算法是目前比較優(yōu)秀的公鑰方案。RSA是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,它能夠抵抗到目前為止已知的 所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA 加密算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但想要對(duì)其乘積進(jìn)行 因式分解卻極其困難,因此可以將乘積公開(kāi)作為加密密鑰。

java代碼如下:

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
 
public class RsaUtils {
 
    private static final String UTF8 = "UTF-8";
 
    /**
     * 隨機(jī)生成密鑰對(duì)
     *
     * @throws NoSuchAlgorithmException
     */
    public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
        // KeyPairGenerator類(lèi)用于生成公鑰和私鑰對(duì),基于RSA算法生成對(duì)象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密鑰對(duì)生成器,密鑰大小為96-1024位
        keyPairGen.initialize(1024, new SecureRandom());
        // 生成一個(gè)密鑰對(duì),保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到私鑰
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        // 得到公鑰
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        // 得到公鑰字符串
        String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded()));
        // 得到私鑰字符串
        String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));
        return new RsaKeyPair(publicKeyString, privateKeyString);
    }
 
    /**
     * RSA公鑰加密
     *
     * @param plainText 加密字符串
     * @param publicKey 公鑰
     * @return 密文
     * @throws Exception
     */
    public static String encrypt(String plainText, String publicKey) throws Exception {
        // base64編碼的公鑰
        byte[] decoded = Base64.getDecoder().decode(publicKey.getBytes(UTF8));
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        // RSA加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[] encodeBytes = Base64.getEncoder().encode(cipher.doFinal(plainText.getBytes(UTF8)));
        return new String(encodeBytes, UTF8);
    }
 
    /**
     * RSA私鑰解密
     *
     * @param encryptText 加密字符串
     * @param privateKey  私鑰
     * @return 明文
     * @throws Exception
     */
    public static String decrypt(String encryptText, String privateKey) throws Exception {
        // 64位解碼加密后的字符串
        byte[] inputByte = Base64.getDecoder().decode(encryptText.getBytes(UTF8));
        // base64編碼的私鑰
        byte[] decoded = Base64.getDecoder().decode(privateKey.getBytes(UTF8));
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        // RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }
 
 
    public static void main(String[] args) throws Exception {
        // 生成公鑰和私鑰
        RsaKeyPair rsaKeyPair = generateKeyPair();
        // 加密字符串
        String message = "river106";
        System.out.println("隨機(jī)生成的公鑰為:" + rsaKeyPair.getPublicKey());
        System.out.println("隨機(jī)生成的私鑰為:" + rsaKeyPair.getPrivateKey());
		System.out.println("原始內(nèi)容: "+message);
        String encryptText = encrypt(message, rsaKeyPair.getPublicKey());
        System.out.println("加密后的字符串為:" + encryptText);
        String messageDe = decrypt(encryptText, rsaKeyPair.getPrivateKey());
        System.out.println("解密后的字符串為:" + messageDe);
    }
 
    private static class RsaKeyPair {
        private String publicKey;
        private String privateKey;
 
		public RsaKeyPair() {
		}
 
		public RsaKeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }
 
        public String getPublicKey() {
            return publicKey;
        }
 
        public void setPublicKey(String publicKey) {
            this.publicKey = publicKey;
        }
 
        public String getPrivateKey() {
            return privateKey;
        }
 
        public void setPrivateKey(String privateKey) {
            this.privateKey = privateKey;
        }
    }
 
}

 

4、DES

DES是對(duì)稱(chēng)的塊加密算法,加解密的過(guò)程是可逆的。

DES 加密算法是一種分組密碼,以 64 位為 分組對(duì)數(shù)據(jù) 加密,它的密鑰長(zhǎng)度是56位,加密解密用同一算法。

DES 加密算法是對(duì)密鑰進(jìn)行保密,而公開(kāi)算法,包括加密和解密算法。這樣,只有掌握了和發(fā)送方相同密鑰的人才能解讀由 DES加密算法加密的密文數(shù)據(jù)。因此,破譯 DES 加密算法實(shí)際上就是搜索密鑰的編碼。對(duì)于56位長(zhǎng)度的密鑰來(lái)說(shuō),如果用窮舉法來(lái)進(jìn)行搜索的話,其運(yùn)算次數(shù)為2^56次。

java代碼如下:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
 
 
public class DesUtils {
 
    private static final String UTF8 = "UTF-8";
    private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};
 
    /**
     * DES加密
     * @param plainText   待加密內(nèi)容
     * @param encryptKey  加密key
     * @return
     * @throws Exception
     */
    public static String encrypt(String plainText, String encryptKey) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(plainText.getBytes(UTF8));
        return new String(Base64.getEncoder().encode(encryptedData), UTF8);
    }
 
    /**
     * DES解密
     * @param encryptedText  已加密內(nèi)容
     * @param decryptKey     解密key
     * @return
     * @throws Exception
     */
    public static String decrypt(String encryptedText, String decryptKey) throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(UTF8), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte decryptedData[] = cipher.doFinal(Base64.getDecoder().decode(encryptedText.getBytes(UTF8)));
        return new String(decryptedData, UTF8);
    }
 
}

 

5、AES

AES是對(duì)稱(chēng)的塊加密算法,加解密的過(guò)程是可逆的。

AES 加密算法是密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn),該加密算法采用對(duì)稱(chēng)分組密碼體制,密鑰長(zhǎng)度的最少支持為128位、 192位、256位,分組長(zhǎng)度128位,算法應(yīng)易于各種硬件和軟件實(shí)現(xiàn)。這種加密算法是美國(guó)聯(lián)邦政府采用的區(qū)塊加密標(biāo)準(zhǔn)。

AES 本身就是為了取代 DES 的,AES具有更好的安全性、效率和靈活性。

java代碼如下:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
 
public class AesUtils {
 
 
    /**
     * 加密
     *
     * @param content  需要加密的內(nèi)容
     * @param password 加密密碼
     * @return
     */
    public static String encrypt(String content, String password) throws Exception {
        StringBuilder sb = new StringBuilder();
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(password.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        // 創(chuàng)建密碼器
        Cipher cipher = Cipher.getInstance("AES");
        byte[] byteContent = content.getBytes("utf-8");
        // 初始化
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] result = cipher.doFinal(byteContent);
        // 將10進(jìn)制字節(jié)數(shù)組轉(zhuǎn)化為16進(jìn)制字符串
        for (int i = 0; i < result.length; i++) {
            String hex = Integer.toHexString(result[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
 
    /**
     * 解密
     *
     * @param content  待解密內(nèi)容
     * @param password 解密密鑰
     * @return
     */
    public static String decrypt(String content, String password) throws Exception {
        // 將16進(jìn)制字符創(chuàng)轉(zhuǎn)為10進(jìn)制字節(jié)數(shù)組
        byte[] result = new byte[content.length() / 2];
        for (int i = 0; i < content.length() / 2; i++) {
            int high = Integer.parseInt(content.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(content.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(password.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        // 創(chuàng)建密碼器
        Cipher cipher = Cipher.getInstance("AES");
        // 初始化
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] data = cipher.doFinal(result);
        return new String(data);
    }
 
}

 

分享到:
標(biāo)簽:加密算法
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定