可逆算法
㈠ 可逆矩阵的计算公式
计算公式: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;
}
}