可逆演算法
㈠ 可逆矩陣的計算公式
計算公式:A^(-1)=(︱A︱)^(-1) A﹡(方陣A的行列式的倒數乘以A的伴隨矩陣)。
這個公式在矩陣A的階數很低的時候(比如不超過4階)效率還是比較高的,但是對於階數非常高的矩陣,通常我們通過對2n*n階矩陣[A In]進行行初等變換,變換成矩陣[In B],於是B就是A的逆矩陣。
矩陣的乘法滿足以下運算律:
結合律:的行向量(或列向量)線性無關。
假設M是一個m×n階矩陣,其中的元素全部屬於域K,也就是實數域或復數域。如此則存在一個分解,其中U是m×m階酉矩陣;Σ是m×n階實數對角矩陣;而V*,即V的共軛轉置,是n×n階酉矩陣。
這樣的分解就稱作M的奇異值分解 。Σ對角線上的元素Σi,i即為M的奇異值。常見的做法是將奇異值由大而小排列。如此Σ便能由M唯一確定了。
比如說再做介面的時候 訪問介面需要帶參數但是明文不安全 如果用不可逆的加密在參數傳到介面後無法解密也就無法得知參數內容介面就無法使用 所以在做介面的參數傳遞的時候加密參數必須要用可逆也就是可解密的方式去做 目前可逆的加密一般都是非對稱的加密方式比如RSA
㈢ 求可逆矩陣的方法
1、公式法:
(3)可逆演算法擴展閱讀:
可逆矩陣的性質:
1、可逆矩陣一定是方陣。
2、如果矩陣A是可逆的,其逆矩陣是唯一的。
3、A的逆矩陣的逆矩陣還是A。記作(A-1)-1=A。
4、可逆矩陣A的轉置矩陣AT也可逆,並且(AT)-1=(A-1)T(轉置的逆等於逆的轉置)。
5、若矩陣A可逆,則矩陣A滿足消去律。即AB=O(或BA=O),則B=O,AB=AC(或BA=CA),則B=C。
6、兩個可逆矩陣的乘積依然可逆。
7、矩陣可逆當且僅當它是滿秩矩陣。
㈣ 演算法的步驟可逆嗎
要分情況
有些時候,當最後結果很明顯,或者,求中間過程時,演算法可逆.
比如:
走迷宮,你很明確終點,便可以從終點往前退
有些時候,你不曉得結果,演算法就不能逆,因為,結果不知道了,就多出變數了,那麼就求不出來了
但就演算法,不考慮結果,演算法是可以逆的(但情況很少,一般這種演算法,不會成立,畢竟不能解決問題)
㈤ 網路上可逆、加密、壓縮、演算法一般有哪些
無損壓縮有:LZ77,LZ78,LZW, FLAC, WavPack, Monkey's Audio, PNG, Tiff
有損的有:mp3, mpeg1/2/4, h.264, h.265, avi, rm,
㈥ 可逆的加密演算法有啥
RAS公鑰演算法
㈦ 關於不可逆演算法
MD5的不可逆是這樣的,通過明文可以得到密文,但知道密文不能得到明文。
比如,B已經知道了3(密文),這時候A發給B 123456(明文),B把123456通過加密演算法得到3,3與B原來的已知密文相同,就知道A所給的明文是正確的。
密文AB都知道,但是明文只有A知道。B可以通過密文驗證一個數字是不是正確的明文,但是沒有辦法通過密文把明文算出來
㈧ 求一個用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));
}
}
㈨ 下面的結論正確的是() A.一個程序的演算法步驟是可逆的 B.一個演算法可以無止境地運算下去的
演算法需每一步都按順序進行,並且結果唯一,不能保證可逆,故A不正確; 一個演算法必須在有限步內完成,不然就不是問題的解了,故B不正確; 一般情況下,完成一件事情的演算法不止一個,但是存在一個比較好的,故C不正確; 設計演算法要盡量運算簡單,節約時間,故D正確, 故選D. |
㈩ 求一個可逆的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;
}
}