可逆加密長度
『壹』 這個是什麼加密方式
幾種加密方式
1 Base64加密方式(可逆)
Base64中的可列印字元包括字母A-Z/a-z/數組0-9/ 加號』+』斜杠』/』 這樣共有62個字元
Base64 ios7之後加入系統庫
2 MD5加密
Message Digest Algorithm MD5(中文名為消息摘要演算法第五版)為計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護
是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、哈希演算法),主流編程語言普遍已有MD5實現。
根據輸出值,不能得到原始的明文,即其過程不可逆
MD5演算法具有以下特點:
1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。
MD5的作用是讓大容量信息在用數字簽名軟體簽署私人密鑰前被」壓縮"成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進制數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。
MD5加鹽
3 鑰匙串加密方式
iCloud鑰匙串,蘋果給我們提供的密碼保存的解決方案,iOS7之後有的
存沙盒:
1、如果手機越獄,密碼容易被竊取。
2、當軟體更新時,沙盒裡的內容是不被刪除的。但是,如果將軟體卸載後重裝,沙盒裡的數據就沒有了。
3、每個APP的沙盒是相對獨立的,密碼無法共用。
存鑰匙串里:
1、蘋果提供的安全方案,rsa加密,相對安全。
2、無論軟體更新或刪除,密碼都存在,都可以自動登錄。
3、同一公司的APP密碼是可以共用的。
4 對稱加密演算法
優點:演算法公開、計算量小、加密速度快、加密效率高、可逆
缺點:雙方使用相同鑰匙,安全性得不到保證
現狀:對稱加密的速度比公鑰加密快很多,在很多場合都需要對稱加密,
演算法: 在對稱加密演算法中常用的演算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。不同演算法的實現機制不同,可參考對應演算法的詳細資料
相較於DES和3DES演算法而言,AES演算法有著更高的速度和資源使用效率,安全級別也較之更高了,被稱為下一代加密標准
『貳』 密文是8位的怎麼解
如果是定長的都是8位的話,這里就可能是一種單向加密的方式,而就是說,只存在從明文向密文進行的一個加密過程,不存在一個由密文向明文的解密過程,這種單向加密又稱非可逆性加密,多用於校檢式對比.校驗顯然不須要知道明文就可以了,所以採用的是單向加密,比較代表性的就是MD5,SHA-1等演算法.
因為明文一般是4-16位,而加密後的密文只有8位,若是一個雙向加密,顯然明文長度大於密文長度,這里其實是說,明文的容量大於密文的容量,不管是那種加密演算法,都會造成大量的"碰撞"!而一個雙向加密演算法的好壞,碰撞機率是一個非常重要的因素的!顯然,若是只有8位時,只能說是一個不太好的校驗方式演算法,也就是單向演算法的.所謂的碰撞就是指的有兩個不同的明文會得到相同的密文,那麼這兩個明文就發生了碰撞.這個機率越大,則演算法的可行性越差!
而若是單向校驗,也就是單向加密,這里雖然碰撞機率大,但可以用程序去做一下控制的!比如你輸入三次密碼如果校驗不成功,則將帳戶進行封凍等都是較好的手段!而雙向加密,別人可以直接進行演算法測試,不會依賴於程序,則很容易破解的.這與密碼設計的初衷是背離的.
如果是8位定長,也就是說不管你是多少位密碼,這極可能是MD5加密或是MD5的前身MD4與MD2加密.也可能是程序設計者自己設計的演算法!但絕對是一個單向加密的!
MD5你可能見過16位的和32位或者更多的.其實你看一下其中的具體實現就知道了,他是四組值進行運算的,最終這四組若是b+c(第二組與第三組組合)就是MD5的16位演算法.若是a+b+c+d四組全組合時就是32位的演算法.但如果系統對於密碼強度大小不是很大時,為了省卻計算機的運算時間,完全可以只有用其中四組中的一組,也就是所能看到的8位的.這種演算法是MD5,但只取的是其中的一組值的.而MD2與MD4恰恰就是與此類似的!因為安全性不強的緣故,現在已經很少或是沒有地方使用了!至少現在的系統中我還沒有看到過.
『叄』 java 對稱加密,不固定長度加密成固定長度密文
你好:
剛剛幫你查了下,所有的帖子,項目例子表示:
目前了解的經典加密(如對稱加密DES,AES,非對稱加密RSA)雖然可逆,但結果長度都是不定的,除非是 固定長度字元串轉固定長度密文
『肆』 php純數字加密為可逆的定長密文
你這不是md5加密嗎,sql直接寫就行了。
你在資料庫工具中執行一下,select md5(1);
或者php的md5函數
echo md5(1);
php自帶可逆的加密是base64_encode和base64_decode,但是這個不是等長的,根據輸入的內容變換長度。估計這個不適合你。
你還是網路」php加密解密「吧,有現成的函數。
『伍』 md5加密可逆嗎
不可逆。但是不建議用來加密密碼,因為密碼長度和復雜度不夠的話,可以通過字典來撞。
『陸』 著名的可逆的加密演算法有哪些
1,DES(Data Encryption Standard):對稱演算法,數據加密標准,速度較快,適用於加密大量數據的場合。
2,3DES(Triple DES):是基於DES的對稱演算法,對一塊數據用三個不同的密鑰進行三次加密,強度更高。
3,RC2和RC4:對稱演算法,用變長密鑰對大量數據進行加密,比 DES 快。
4,IDEA(International Data Encryption Algorithm)國際數據加密演算法,使用 128 位密鑰提供非常強的安全性。
5,RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件塊的長度也是可變的,非對稱演算法。
(6)可逆加密長度擴展閱讀:
據記載,公元前400年,古希臘人發明了置換密碼。1881年世界上的第一個電話保密專利出現。在第二次世界大戰期間,德國軍方啟用「恩尼格瑪」密碼機,密碼學在戰爭中起著非常重要的作用。
隨著信息化和數字化社會的發展,人們對信息安全和保密的重要性認識不斷提高,於是在1997年,美國國家標准局公布實施了「美國數據加密標准(DES)」,民間力量開始全面介入密碼學的研究和應用中,採用的加密演算法有DES、RSA、SHA等。隨著對加密強度需求的不斷提高,近期又出現了AES、ECC等。
使用密碼學可以達到以下目的:
保密性:防止用戶的標識或數據被讀取。
數據完整性:防止數據被更改。
身份驗證:確保數據發自特定的一方。
參考資料來源:網路-加密演算法
『柒』 加密、簽名、證書的作用及運用場景
本文主要是簡單介紹了常見的加密類型、各自的運用場景、為什麼需要數字簽名和數字證書、HTTPS涉及到的加密流程等。這里主要從使用者的角度出發,對演算法本身不做過多介紹。
對稱/非對稱加密均屬於 可逆加密,可以通過密鑰將密文還原為明文 。
有時候,我們希望明文一旦加密後,任何人(包括自己)都無法通過密文逆推回明文,不可逆加密就是為了滿足這種需求。
不可逆加密主要通過 hash演算法實現:即對目標數據生成一段特定長度hash值 ;無論你的數據是1KB、1MB、1GB,都是生成特定長度的一個Hash值(比如128bit)。這里大家應該能感受到一點 不可逆 的味道,加密後128bit的hash值顯然無法還原出1個G甚至更大的不規則數據的, hash可以看做是原來內容的一個摘要 。
常見演算法:
小明給小紅寫信:
經過九轉十八彎後,信的內容有可能:1. 被窺視 2. 被篡改(冒充小明發送假消息) :
小紅先 生成對稱加密的密鑰key1 ,然後通過一個安全的渠道交予小明。
傳輸數據時,小明 使用key1加密 ,而小紅收到後再 使用key1解密 。
這時候 中間者既看不到原來的內容,也沒辦法篡改 (因為沒有密鑰):
【對稱加密】實現簡單,性能優秀 ,演算法本身安全級別高。然而對 密鑰的管理 卻是個很頭疼的問題:一旦密鑰交到對方手裡,對方對密鑰的保管能力 我方是沒辦法控制 的,一旦對方泄露的話,加密就形同虛設了。
相對而言,【非對稱加密】的公鑰就沒有這個憂慮,因為 公鑰 的設計就是為了 可以公開的 ,盡管對方泄露,我方也不會有任何損失。
小紅生成一對公私鑰,自己持有私鑰(pri_key1),將公鑰(pub_key1)交予小明。
傳輸數據時,小明使用 公鑰加密 ,小紅使用 私鑰解密 。
因為 中間者沒有私鑰,公鑰加密的內容是無法獲取的 。此時達到了 防窺視 的效果:
然而因為 公鑰是可以公開的 ,如果 中間者知曉公鑰 的話,盡管沒有辦法看到原來的內容,卻 可以冒充小明發送假消息 :
這時小紅在想,如果小明發送消息時,能帶上 只有他自己才能生成 的數據(字元串),我就能 驗證是不是小明發的真實消息 了。
通常這個 能證實身份的數據(字元串) 被稱之為 數字簽名(Signature)
小明再生成一對公私鑰 ,自己持有私鑰(pri_key2),將公鑰交予小紅(pub_key2)。
當小明傳輸數據時(可能很大),除了公鑰加密明文之外,還要帶上簽名:(1) 對明文做一個hash摘要 (2)對摘要進行私鑰加密,加密結果即簽名(傳輸內容=內容密文+簽名)
小紅收到後:(1) 解密簽名獲取hash (2)解密內容密文,對解密後的明文進行hash;如果兩個hash一致,說明驗簽通過。
盡管中間者修改了傳輸內容,但因為簽名無法冒認(沒有私鑰),小紅驗簽失敗,自然不會認可這份數據:
通常 非對稱加密要做到防窺視和防篡改,需要有兩對公私鑰 :對方的公鑰用於內容加密,自己的私鑰用於簽名(讓對方驗證身份)。
因為HTTP協議明文通信的安全問題,引入了HTTPS:通過建立一個安全通道(連接),來保證數據傳輸的安全。
伺服器是 沒辦法直接將密鑰傳輸到瀏覽器的 ,因為在 安全連接建立之前,所有通信內容都是明文的 ,中間者可窺視到密鑰信息。
或許這時你想到了非對稱加密,因為公鑰是不怕公開的:
然而在第2步, 中間者可以截取伺服器公鑰,並替換成了自己的公鑰 ,此時加密就沒意義了:
為了 防止公鑰被假冒,數字證書(digital certificate )便誕生了 。
當伺服器需要告訴瀏覽器公鑰時,並不是簡單地返回公鑰,而是響應 包含公鑰信息在內的數字證書 。
證書主要包含以下內容:
瀏覽器通過 【頒發機構的公鑰】進行解密驗簽 ,驗簽通過即說明證書的真實性,可以放心取 證書擁有者的公鑰 了。( 常用CA機構的公鑰都已經植入到瀏覽器裡面 )
數字證書只做一件事: 保證 伺服器響應的 公鑰是真實的 。
以上保證了 [瀏覽器⇒伺服器] 是加密的,然而 [伺服器⇒瀏覽器] 卻沒有(上圖第4步);另外一個是 性能問題 ,如果所有數據都使用非對稱加密的話,會消耗較多的伺服器資源,通信速度也會受到較大影響。
HTTPS巧妙地結合了非對稱加密和對稱加密,在保證雙方通信安全的前提下,盡量提升性能。
HTTPS(SSL/TLS)期望 建立安全連接後,通信均使用【對稱加密】 。
建立安全連接的任務就是讓 瀏覽器-伺服器協商出本次連接使用的【對稱加密的演算法和密鑰】 ;協商過程中會使用到【非對稱加密】和數字證書。
特別注意的是:協商的密鑰必須是不容易猜到(足夠隨機的):
其中比較核心的是隨機數r3(pre-master secret),因為之前的r1、r2都是明文傳輸的, 只有r3是加密傳輸 的。至於為什麼需要三個隨機數,可以參考:
以上是一個比較簡單的HTTPS流程,詳細的可以參考文末的引用。
參考資料:
[1] 數字證書應用綜合揭秘
[2] SSL/TLS協議運行機制的概述
[3] 圖解SSL/TLS協議
[4] 《圖解HTTP》
『捌』 md5加密以後的字元串長度
加密後為128位(bit),按照16進制(4位一個16進制數)編碼後,就成了32個字元。MD5並不是加密演算法,而是摘要演算法。加密演算法是可逆的,摘要演算法是理專論上不可逆的,詳細步驟:
1、md5演算法主要應用在密碼領域,為了防止明文傳輸密碼的危險性,一般會用密碼的md5值來代替密碼本身。
『玖』 md5可逆嗎
MD5作為一種校驗手段而不是加密手段。在內容位元組長度小於MD5值的位元組長度,是可逆的,但存在重復的可能。
由於概率較低,且基於加密前內容一般可識讀,所以你懂的為毛有那麼多md5解密的網站,但是又有人說md5絕對不可逆。首先md5不是加密,只是根據已有數據生成特徵值,用於簽名,完整性檢查。好的散列演算法要求a到b容易,但找到能生成b的數據難;a變動一點點,b完全不一樣。md5是單向函數,所以他是不可逆的,有人說,為什麼網上能解密,那並不是真正意思的解密,而是採用暴力破解的方式去猜測這個密碼。
『拾』 求一個用java編寫的可逆的加密演算法程序,自己寫的小程序也行。
public class mySecurity {
private static KeyGenerator keygen ;
private static SecretKey secretKey;
private static Cipher cipher;
private static mySecurity security = null;
private mySecurity(){
}
public static mySecurity getInstance() throws Exception{
if(security == null){
security = new mySecurity();
keygen = KeyGenerator.getInstance("AES");
secretKey = keygen.generateKey();
cipher =Cipher.getInstance("AES");
}
return security;
}
//加密
public String encrypt(String str) throws Exception{
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
byte [] src = str.getBytes(); byte [] enc = cipher.doFinal(src);
return parseByte2HexStr(enc); }
//解密
public String decrypt(String str) throws Exception{
cipher.init(Cipher.DECRYPT_MODE,secretKey);
byte[] enc = parseHexStr2Byte(str); byte [] dec = cipher.doFinal(enc);
return new String(dec); }
/**將16進制轉換為二進制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**將二進制轉換成16進制
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
public static void main(String[] args) throws Exception{
String str = "abc haha 我";
String ss = mySecurity.getInstance().encrypt(str) ;
System.out.println(ss);
System.out.println(mySecurity.getInstance().decrypt(ss));
}
}