可逆加密解密
可逆的,定長的
如果對輸入沒有限制,「可逆的」和「定長的」是不可能並存的
因為定長的字元串數量有限,
有限的結果和無限的輸入是無法一一對應的(可逆)
❷ 加密演算法518867對應0,518866對應1,518873對應10,請問這是什麼演算法
對於大部分密碼加密,我們可以採用md5、sha1等方法。可以有效防止數據泄露,但是這些方法僅適用於無需還原的數據加密。對於需要還原的信息,則需要採用可逆的加密解密演算法,下面一組PHP函數是實現此加密解密的方法
加密演算法如下: 代碼如下: function encrypt($data, $key) { $key = md5($key); $x = 0; $len = strlen($data); $l = strlen($key); for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= $key{$x}; $x++; } for ($i = 0; $i < $len; $i++) { $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); } return base64_encode($str); } 解密演算法如下: 代碼如下: function decrypt($data, $key) { $key = md5($key); $x = 0; $data = base64_decode($data); $len = strlen($data); $l = strlen($key); for ($i = 0; $i < $len; $i++) { if ($x == $l) { $x = 0; } $char .= substr($key, $x, 1); $x++; } for ($i = 0; $i < $len; $i++) { if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) { $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); } else { $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); } } return $str; } 上述加密解密的過程均需要用到一個加密密鑰(即參數$key)。 代碼如下: $data = 'PHP加密解密演算法'; // 被加密信息 $key = '123'; // 密鑰 $encrypt = encrypt($data, $key); $decrypt = decrypt($encrypt, $key); echo $encrypt, "n", $decrypt; 上述將輸出類似如下結果: 代碼如下: gniCSOzZG+HnS9zcFea7SefNGhXF PHP加密解密演算法 從上述結果可以看出,這是一組可逆的加密解密演算法,可以用於部分需要還原的數據加密。
❸ 著名的可逆的加密演算法有哪些
1,DES(Data Encryption Standard):對稱演算法,數據加密標准,速度較快,適用於加密大量數據的場合。
2,3DES(Triple DES):是基於DES的對稱演算法,對一塊數據用三個不同的密鑰進行三次加密,強度更高。
3,RC2和RC4:對稱演算法,用變長密鑰對大量數據進行加密,比 DES 快。
4,IDEA(International Data Encryption Algorithm)國際數據加密演算法,使用 128 位密鑰提供非常強的安全性。
5,RSA:由 RSA 公司發明,是一個支持變長密鑰的公共密鑰演算法,需要加密的文件塊的長度也是可變的,非對稱演算法。
(3)可逆加密解密擴展閱讀:
據記載,公元前400年,古希臘人發明了置換密碼。1881年世界上的第一個電話保密專利出現。在第二次世界大戰期間,德國軍方啟用「恩尼格瑪」密碼機,密碼學在戰爭中起著非常重要的作用。
隨著信息化和數字化社會的發展,人們對信息安全和保密的重要性認識不斷提高,於是在1997年,美國國家標准局公布實施了「美國數據加密標准(DES)」,民間力量開始全面介入密碼學的研究和應用中,採用的加密演算法有DES、RSA、SHA等。隨著對加密強度需求的不斷提高,近期又出現了AES、ECC等。
使用密碼學可以達到以下目的:
保密性:防止用戶的標識或數據被讀取。
數據完整性:防止數據被更改。
身份驗證:確保數據發自特定的一方。
參考資料來源:網路-加密演算法
❹ 數據加密演算法可以分為幾大類型,個舉一例說明
分為三類:
1、對稱加密;
2、不對稱加密;
3、不可逆加密。
對稱加密是指加密密鑰和解密密鑰相同;
不對稱加密演算法使用不同的加密密鑰和解密密鑰;
不可逆加密演算法的特徵是加密過程不需要密鑰,並且經過加密的數據無法被解密,只有同樣輸入的輸入數據經過同樣的不可逆演算法才能得到同樣的加密數據。
❺ 作者開發的app進入需要密碼,怎麼破解
密碼存儲在本地,一般存儲在文件,注冊表,資料庫,也有直接寫到軟體里。
明文存儲,用調試工具跟蹤執行到密碼判斷的代碼,一般是一個比較語句:如果(輸入)=(密碼),在計算機內存中就能看到密碼。密碼可逆加密存儲,一種情況程序中把加密密碼解密後,還是明文比較,我們同樣能在內存中看到密碼。一種情況是非明文比較,一般需要閱讀匯編代碼或偽代碼或腳本。弄明白加密演算法,自己寫解密演算法。把存儲的加密密碼解密。密碼加密不可逆,一般很難破解到密碼。
❻ php純數字加密為可逆的定長密文
你這不是md5加密嗎,sql直接寫就行了。
你在資料庫工具中執行一下,select md5(1);
或者php的md5函數
echo md5(1);
php自帶可逆的加密是base64_encode和base64_decode,但是這個不是等長的,根據輸入的內容變換長度。估計這個不適合你。
你還是網路」php加密解密「吧,有現成的函數。
❼ 求一個可逆的C#加密解密演算法
加密:EncryptDES("要加密的字元串", "azjmerbv");
解密:DecryptDES("要解密的字元串", "azjmerbv");
//默認密鑰向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/// <summary>
/// DES加密字元串
/// </summary>
/// <param name="encryptString">待加密的字元串</param>
/// <param name="encryptKey">加密密鑰,要求為8位</param>
/// <returns>加密成功返回加密後的字元串,失敗返回源串</returns>
public static string EncryptDES(string encryptString, string encryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch
{
return encryptString;
}
}
/// <summary>
/// DES解密字元串
/// </summary>
/// <param name="decryptString">待解密的字元串</param>
/// <param name="decryptKey">解密密鑰,要求為8位,和加密密鑰相同</param>
/// <returns>解密成功返回解密後的字元串,失敗返源串</returns>
public static string DecryptDES(string decryptString, string decryptKey)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
❽ android,java 通用的加密解密方式有幾種
移動端越來越火了,我們在開發過程中,總會碰到要和移動端打交道的場景,比如.NET和android或者iOS的打交道。為了讓數據交互更安全,我們需要對數據進行加密傳輸。今天研究了一下,把幾種語言的加密都實踐了一遍,實現了.NET,java(android),iOS都同一套的加密演算法,下面就分享給大家。
AES加密有多種演算法模式,下面提供兩套模式的可用源碼。
加密方式:
先將文本AES加密
返回Base64轉碼
解密方式:
將數據進行Base64解碼
進行AES解密
一、CBC(Cipher Block Chaining,加密塊鏈)模式
是一種循環模式,前一個分組的密文和當前分組的明文異或操作後再加密,這樣做的目的是增強破解難度.
密鑰
密鑰偏移量
java/adroid加密AESOperator類:
package com.bci.wx.base.util;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* AES 是一種可逆加密演算法,對用戶的敏感信息加密處理 對原始數據進行AES加密後,在進行Base64編碼轉化;
*/
public class AESOperator {
/*
* 加密用的Key 可以用26個字母和數字組成 此處使用AES-128-CBC加密模式,key需要為16位。
*/
private String sKey = "smkldospdosldaaa";//key,可自行修改
private String ivParameter = "0392039203920300";//偏移量,可自行修改
private static AESOperator instance = null;
private AESOperator() {
}
public static AESOperator getInstance() {
if (instance == null)
instance = new AESOperator();
return instance;
}
public static String Encrypt(String encData ,String secretKey,String vector) throws Exception {
if(secretKey == null) {
return null;
}
if(secretKey.length() != 16) {
return null;
}
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] raw = secretKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一個向量iv,可增加加密演算法的強度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(encData.getBytes("utf-8"));
return new BASE64Encoder().encode(encrypted);// 此處使用BASE64做轉碼。
}
// 加密
public String encrypt(String sSrc) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一個向量iv,可增加加密演算法的強度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return new BASE64Encoder().encode(encrypted);// 此處使用BASE64做轉碼。
}
// 解密
public String decrypt(String sSrc) throws Exception {
try {
byte[] raw = sKey.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
} catch (Exception ex) {
return null;
}
}
public String decrypt(String sSrc,String key,String ivs) throws Exception {
try {
byte[] raw = key.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(ivs.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
} catch (Exception ex) {
return null;
}
}
public static String encodeBytes(byte[] bytes) {
StringBuffer strBuf = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
}
return strBuf.toString();
}
❾ 求簡潔的ASP可逆加密演算法,要求看不出規律。
<%
functionjiami(byvals)'加密
randomize
s=escape(s)
fori=1tolen(s)
k=int(rnd*256)
jiami=jiami&right("0"&hex(asc(mid(s,i,1))xork),2)&right("0"&hex(k),2)
next
endfunction
functionjiemi(byvals)'解密
fori=1tolen(s)step4
jiemi=jiemi&chr(int("&H"&mid(s,i,2))xorint("&H"&mid(s,i+2,2)))
next
jiemi=unescape(jiemi)
endfunction
s="123網路知道abc"
response.write"要加密的字元串:"&s&"<br>"
s=jiami(s)
response.write"加密後的字元串:"&s&"<br>"
s=jiemi(s)
response.write"解密後的字元串:"&s&"<br>"
%>
這個加密程序的妙處在於,同一個字元串每次加密後的字元串都是不相同的,但都能夠解密回原來的字元串。
❿ C#將字元串加密成數字,可逆解密,能實現不
再貼一個我昨晚寫的優化過的演算法,效率有明顯提升: string s = File.ReadAllText(@"c:\C語言概念題解答選編.txt", Encoding.GetEncoding("gb2312")); int key = 12345; StringBuilder sb = new StringBuilder(5 * s.Length); foreach (char c in s) sb.Append((c ^ key).ToString("D5")); string r1 = sb.ToString(); Response.Write("加密後:" + r1 + "<br/>"); sb = new StringBuilder(r1.Length / 5); for (int i = 0; i < r1.Length; i += 5) { int value = int.Parse(r1.Substring(i, 5)) ^ key; sb.Append((char)value); } string r2 = sb.ToString(); Response.Write("解密後:" + r2);測試100KB左右大小的文本文件,加密部分用時35毫秒、解密部分用時45毫秒。密鑰為0~65535的整數。