3des是對稱還是非對稱:3des加密解密算法

我不是高手,我只是一個普通的程序員,我特別願意大家留言討論,批評指正,您給我指正了,我就去查資料,去做實驗,我技術就能得到提高,我認為這是一個程序員的基本素養。

接上一篇

前面兩篇介紹了一下摘要算法MD5和SHA,這一篇介紹一下對稱加密算法AES,這就是真正的加密算法了,前面介紹的摘要算法只能用來提取摘要信息,來對比文件的一致性,是不可逆的,並不能對加密的數據進行還原。

還是前面那句話,只聊用法,不聊具體的原理,因為我不懂。

簡言之,提供一個密鑰,對一段明文數據通過算法進行一個加密,密鑰長度越長越安全。

加密以後的數據,通過同一個密鑰進行解密就能拿到加密前的明文數據,因為加密和解密用的是同一個密鑰,所以又叫對稱加密,後面我會在介紹一個加密和解密用不同的密鑰就叫做非對稱加密。

對稱加密常用的算法有DES(全稱 Data Encryption Standard),3DES(稱為 Triple DES)就是DES的增強版用DES加密3次,還有就是今天要介紹的AES,比DES和3DES安全性更高。

下面是加密和解密的代碼。

首先,java里的AES默認的密鑰長度是128位,如果需要再加長也是可以的,其實128位已經足夠了。怎麼才能設置一個128位元組的密碼呢,不能每次都記住128個byte,這就用到了我們前面提到的散列算法,比如MD5就是把任何數據都能轉換成128個byte,而且只要你數據不變,轉換出來的這128個byte就不變,這樣你的密碼如果設置為123456,那麼你AES加密的密鑰就是123456通過MD5散列到的128個byte,當你解密的時候,你就可以同樣用123456散列到同樣的128個byte作為密鑰去解密,記住123456總比記住128個byte要簡單的多。當然AES的密鑰並不是通過MD5來的,我只是用大家更熟悉的MD5舉例子來說明這個思路。

下面是我整理並使用的java的AES的加密解密代碼,c#跟python也都有成熟的代碼,思路也是一樣的。

/**
	 * 通過對任意密碼進行散列運算得到128位密鑰
	 * @param password
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static SecretKeySpec getSecretKey(String password) throws NoSuchAlgorithmException {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");// 創建AES的Key生產者
		SecureRandom ramdom = SecureRandom.getInstance("SHA1PRNG");
		ramdom.setSeed(password.getBytes());
        kgen.init(128, ramdom);
        SecretKey secretKey = kgen.generateKey();// 根據用戶密碼,生成一個密鑰
        byte[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰
        System.out.println(enCodeFormat.length);
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 轉換為AES專用密鑰
        return key;
	}
	
	/**
	 * AES加密字符串
	 *
	 * @param data  需要被加密的數據
	 * @param password 加密需要的密碼
	 * @return 密文
	 */
	public static byte[] encrypt(byte[] data, String password) {
		try {			
			Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
			cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));// 初始化為加密模式的密碼器
			byte[] result = cipher.doFinal(data);// 加密
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
     * 解密AES加密過的字符串
     *
     * @param content
     *            AES加密過過的內容
     * @param password
     *            加密時的密碼
     * @return 明文
     */
    public static byte[] decrypt(byte[] content, String password) {
        try {
            Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));// 初始化為解密模式的密碼器
            byte[] result = cipher.doFinal(content);
            return result; // 明文
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return null;
    }

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/227907.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 21:25
下一篇 2024-12-09 21:25

相關推薦

發表回復

登錄後才能評論