当前位置: 首页>C语言>正文

常用加密方式有哪些,不可逆加密:說一下你常用的加密算法

常用加密方式有哪些,不可逆加密:說一下你常用的加密算法

加密算法我們整體可以分為:可逆加密和不可逆加密,可逆加密又可以分為:對稱加密和非對稱加密。

一、不可逆加密

常見的不可逆加密算法有MD5HMACSHA1SHA-224SHA-256SHA-384,和SHA-512,其中SHA-224SHA-256SHA-384,和SHA-512我們可以統稱為SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的數字表示的是加密后的字符串長度,SHA1默認會產生一個160位的信息摘要。

不可逆加密算法最大的特點就是密鑰,但是HMAC是需要密鑰的【手動狗頭】。

由于這些加密都是不可逆的,因此比較常用的場景就是用戶密碼加密,其驗證過程就是通過比較兩個加密后的字符串是否一樣來確認身份的。網上也有很多自稱是可以破解MD5密碼的網站,其原理也是一樣,就是有一個巨大的資源庫,存放了許多字符串及對應的MD5加密后的字符串,通過你輸入的MD5加密串來進行比較,如果過你的密碼復雜度比較低,還是有很大機率驗證出來的。

1.1 MD5

MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用于確保信息傳輸完整一致。

常用加密方式有哪些,MD5算法有以下特點:

1、壓縮性:無論數據長度是多少,計算出來的MD5值長度相同

2、容易計算性:由原數據容易計算出MD5

3、抗修改性:即便修改一個字節,計算出來的MD5值也會巨大差異

4、抗碰撞性:知道數據和MD5值,很小概率找到相同MD5值相同的原數據。

public static String md5(String text) {MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) www.leguojizc.cn{e.printStackTrace();}byte[] bytes = messageDigest.digest(text.getBytes());return Hex.encodeHexString(bytes); 
}

1.2 SHA系列

安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數家族,是FIPS所認證的安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高。

可逆加密算法有哪些。2005年8月17日的CRYPTO會議尾聲中王小云、姚期智、姚儲楓再度發表更有效率的SHA-1攻擊法,能在2的63次方個計算復雜度內找到碰撞。

也就是說SHA-1加密算法有碰撞的可能性,雖然很小。

public static String sha256(String text)  www.shangdu2zc.cn{MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance("SHA-256");} catch (NoSuchAlgorithmException e) www.tengyao3zc.cn{e.printStackTrace(www.jujinyule.com);}byte[www.lcx528.cn] bytes = messageDigest.digest(text.getBytes()); return Hex.encodeHexString(bytes); 
}

1.3 HMAC系列

HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code)的縮寫,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一種基于Hash函數和密鑰進行消息認證的方法,并于1997年作為RFC2104被公布,并在IPSec和其他網絡協議(如SSL)中得以廣泛應用,現在已經成為事實上的Internet安全標準。它可以與任何迭代散列函數捆綁使用。

HMAC算法更像是一種加密算法,它引入了密鑰,其安全性已經不完全依賴于所使用的Hash算法

public static String hmacSha256(String text, SecretKeySpec sk) {Mac mac = null;try {mac =www.feihongyul.cn Mac.getInstance("HmacSHA256");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}try {mac.init( www.youy2zhuce.cn);} catch (www.mLgjzc.cn InvalidKeyException e) {e.printStackTrace();}byte[www.jintianxuesha.com] rawHmac = mac.doFinal(text.getBytes());return new String(Base64.encodeBase64(rawHmac));
}

如果要使用不可逆加密,推薦使用SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512這幾種算法。

二、對稱加密算法

對稱加密算法是應用比較早的算法,在數據加密和解密的時用的都是同一個密鑰,這就造成了密鑰管理困難的問題。常見的對稱加密算法有DES3DESAES128AES192AES256?(默認安裝的?JDK?尚不支持?AES256,需要安裝對應的?jce?補丁進行升級?jce1.7jce1.8)。其中AES后面的數字代表的是密鑰長度。對稱加密算法的安全性相對較低,比較適用的場景就是內網環境中的加解密。

2.1 DES

加密方式、DES是對稱加密算法領域中的典型算法,其密鑰默認長度為56位。

// 加密
public static String encrypt(byte[] dataSource, String password){try {SecureRandom random = new SecureRandom();DESKeySpec desKeySpec = new DESKeySpec(password.getBytes());//創建一個密匙工廠,然后用它把DESKeySpec轉換成 SecretKeyFactory www.javachenglei.com secretKeyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); //Cipher對象實際完成加密操作 Cipher cipher = Cipher.getInstance("DES"); //用密匙初始化Cipher對象 cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); //正式執行加密操作 return Base64.encodeBase64String(cipher.doFinal(dataSource)); } catch (Throwable e) { e.printStackTrace(); } return null; } 
// 解密
public static String decrypt(String src, String password) throws Exception{ // DES算法要求有一個可信任的隨機數源 SecureRandom random = new SecureRandom(); // 創建一個DESKeySpec對象 DESKeySpec desKeySpec =www.chuancenpt.com new DESKeySpec(password.getBytes()); // 創建一個密匙工廠 SecretKeyFactory keyFactory www.letianhuanchao.cn= SecretKeyFactory.getInstance("DES"); // 將DESKeySpec對象轉換成SecretKey對象 SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // Cipher對象實際完成解密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher對象 cipher.init(Cipher.DECRYPT_MODE, secretKey, random); // 真正開始解密操作 return new String(cipher.doFinal(Base64.decodeBase64(src))); 
}

2.2 3DES

3DES(即Triple DES)是DESAES過渡的加密算法,它使用3條56位的密鑰對數據進行三次加密。是DES的一個更安全的變形。它以DES為基本模塊,通過組合分組方法設計出分組加密算法。比起最初的DES3DES更為安全。密鑰長度默認為168位,還可以選擇128位。

public static String encryptThreeDESECB(String src, String key) {try{DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");SecretKey securekey = keyFactory.generateSecret(dks);Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, securekey);byte[www.fengminpt.cn] b = cipher.doFinal(src.getBytes("UTF-8"));String ss = new String(Base64.encodeBase64(b));ss = ss.replaceAll("\\+", "-");ss = ss.replaceAll(www.shentuylgw.cn "/", "_");return ss;} catch(Exception ex){ex.printStackTrace();return src;}
}public static String decryptThreeDESECB(String src, String key) {try{src = src.replaceAll("-", "+");src = src.replaceAll("_", "/");byte[] bytesrc = Base64.decodeBase64(src.getBytes("UTF-8"));// --解密的keyDESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");SecretKey securekey = keyFactory.generateSecret(dks);// --Chipher對象解密Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, securekey);byte[] retByte = cipher.doFinal(bytesrc);return new String(retByte, "UTF-8");} catch(Exception ex){ex.printStackTrace();return src;}
}

2.3 AES

AES?高級數據加密標準,能夠有效抵御已知的針對DES算法的所有攻擊,默認密鑰長度為128位,還可以供選擇192位,256位。這里順便提一句這個位指的是bit。

private static final String defaultCharset = "UTF-8";
private static final String KEY_AES = "AES";
private static final String KEY_MD5 = "MD5";
private static MessageDigest md5Digest;
static {try {md5Digest = MessageDigest.getInstance(KEY_MD5);} catch (NoSuchAlgorithmException e) {}
}
/*** 加密*/
public static String encrypt(String data, String key) {return doAES(data, key, Cipher.ENCRYPT_MODE);
}
/*** 解密*/
public static String decrypt(String data, String key) {return doAES(data, key, Cipher.DECRYPT_MODE);
}/*** 加解密*/
private static String doAES(String data, String key, int mode) {try {boolean encrypt = mode == Cipher.ENCRYPT_MODE;byte[] content;if (encrypt) {content = data.getBytes(defaultCharset);} else {content = Base64.decodeBase64(data.getBytes());}SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset)), KEY_AES);Cipher cipher = Cipher.getInstance(KEY_AES);// 創建密碼器cipher.init(mode, keySpec);// 初始化byte[] result = cipher.doFinal(content);if (encrypt) {return new String(Base64.encodeBase64(result));} else {return new String(result, defaultCharset);}} catch (Exception e) {}return null;
}

推薦使用對稱加密算法有:AES128AES192AES256

三、非對稱加密算法

非對稱加密算法有兩個密鑰,這兩個密鑰完全不同但又完全匹配。只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。常見的非對稱加密有RSASM2等。

3.1 RSA

RSA密鑰至少為500位長,一般推薦使用1024位。

//非對稱密鑰算法
public static final String KEY_ALGORITHM = "RSA";/*** 密鑰長度,DH算法的默認密鑰長度是1024* 密鑰長度必須是64的倍數,在512到65536位之間*/
private static final int KEY_SIZE = 1024;
//公鑰
private static final String PUBLIC_KEY = "RSAPublicKey";
//私鑰
private static final String PRIVATE_KEY = "RSAPrivateKey";
/*** 初始化密鑰對** @return Map 甲方密鑰的Map*/
public static Map<String, Object> initKey() throws Exception {//實例化密鑰生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);//初始化密鑰生成器keyPairGenerator.initialize(KEY_SIZE);//生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();//甲方公鑰RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//甲方私鑰RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//將密鑰存儲在map中Map<String, Object> keyMap = new HashMap<String, Object>();keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;
}
/*** 私鑰加密** @param data 待加密數據* @param key  密鑰* @return byte[] 加密數據*/
public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {//取得私鑰PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私鑰PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//數據加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);
}/*** 公鑰加密** @param data 待加密數據* @param key  密鑰* @return byte[] 加密數據*/
public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {//實例化密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//初始化公鑰//密鑰材料轉換X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);//產生公鑰PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);//數據加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipher.doFinal(data);
}/*** 私鑰解密** @param data 待解密數據* @param key  密鑰* @return byte[] 解密數據*/
public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {//取得私鑰PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私鑰PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//數據解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);
}/*** 公鑰解密** @param data 待解密數據* @param key  密鑰* @return byte[] 解密數據*/
public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {//實例化密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//初始化公鑰//密鑰材料轉換X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);//產生公鑰PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);//數據解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, pubKey);return cipher.doFinal(data);
}/*** 取得私鑰** @param keyMap 密鑰map* @return byte[] 私鑰*/
public static byte[] getPrivateKey(Map<String, Object> keyMap) {Key key = (Key) keyMap.get(PRIVATE_KEY);return key.getEncoded();
}/*** 取得公鑰** @param keyMap 密鑰map* @return byte[] 公鑰*/
public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();
}

四、加密鹽

公認不安全的加密算法、加密鹽也是比較常聽到的一個概念,鹽就是一個隨機字符串用來和我們的加密串拼接后進行加密。加鹽主要是為了提供加密字符串的安全性。假如有一個加鹽后的加密串,黑客通過一定手段這個加密串,他拿到的明文,并不是我們加密前的字符串,而是加密前的字符串和鹽組合的字符串,這樣相對來說又增加了字符串的安全性。

文中的一些算法來源于網絡,可直接復制使用

比較推薦的幾個加密算法有:

  • 不可逆加密:SHA256SHA384SHA512以及HMAC-SHA256HMAC-SHA384HMAC-SHA512
  • 對稱加密算法:AES3DES
  • 非對稱加密算法:RSA

https://www.nshth.com/c/338900.html
>

相关文章:

  • 常用加密方式有哪些
  • 可逆加密算法有哪些
  • 加密方式
  • 公認不安全的加密算法
  • 不可逆加密是什么意思
  • RSA加密是可逆的嗎
  • 非對稱密碼算法有哪些
  • 加密過程是可逆還是不可逆
  • 常用加密方式有哪些,不可逆加密:說一下你常用的加密算法
  • 各種資源網址
  • GItHub頻繁驗證郵箱?Please verify your email address????
  • 零售管理系統,【第十六篇】商城系統-認證系統構建
  • 將一列數據導入另一列,excel將B列數據放在A列后面
  • 將圖片內容轉化為excel文檔,插入 PNG 圖片至 Excel
  • DDG檢測的臨床意義,DDPG中的Ornstein-Uhlenbeck過程怎么理解
  • 單片機編程入門教程,新手入門單片機實戰超詳細以及遇到一些坑-避障小車1【更新中】
  • 基于STM32視覺檢測程序設計,畢業設計 單片機stm32廚房環境檢測系統 - 物聯網 嵌入式
  • 學生成績管理系統數據庫設計,基于C#結合SQL設計學生成績系統系統
  • 電腦搜索文件的軟件,【記錄】everything搜索不到電腦上文件的解決方案
  • everything搜索工具,everything搜到不到文件的設置問題
  • 蘋果電腦怎么搜索文件,mac搜索文件為什么啥都搜不出來?
  • 七大編程語言難度排名,編程語言“破劍式”——編程語言學什么?
  • 小程序一鍵生成工具,微信小程序頭像上傳+(C#)服務端接收
  • simulink整流器模塊,Simulink取最大(小)值方法總結
  • oracle題庫及答案,ORACLE找出最大的數返回 GREATEST()函數
  • 輾轉相除法求最小公倍數的方法,【常用算法】輾轉相除法求最大公約數
  • 整數大小的比較方法,判斷較大整數
  • 軟件行業的發展前景,這不是你想象中的軟件產業
  • 一篇文章,還有一篇
  • 人臉識別特征點,特征點數量與人臉識別準確度沒有直接關系
  • dinkelbach算法介紹,two-stage算法一點思考
  • dsra9110e connection is closed,resent101-DSSD報錯solution
  • 小青蛙跳臺階的另類思考
  • 青蛙游戲 linux,小青蛙2048
  • k8s容器化部署,K8S之POD調度
  • 【JS逆向系列】某乎x96參數與jsvmp初體驗
  • 未能寫入文件,未能寫入輸出文件..”--“拒絕訪問。”的解決辦法 [轉]
  • unity游戲紅色感嘆號崩潰,[Unity]讀取本地圖片ArgumentException: A null reference or invalid value