加密算法:如何实现一种知道原始数据,加密可逆;不知道原始数据,加密不可逆

最近在研究加密算法,最有效的就是MD5加密,因为是不可逆的

MD5加密原理

MD5是一种散列函数(也叫哈希函数,哈希函数又称散列函数,杂凑函数),他是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程,哈希函数可以将任意长度的输入经过变化后得到固定长度的输出,这个固定长度的输出称为原消息的散列或消息映射。


MD5中的MD代表Message Digest,就是信息摘要的意思,不过这个信息摘要不是信息内容的缩写,而是根据公开的MD5算法对原信息进行数学变换后得到的一个128位(bit)的特征码。

那什么是Hash (散列函数)呢

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。


MD5中的MD代表Message Digest,就是信息摘要的意思,不过这个信息摘要不是信息内容的缩写,而是根据公开的MD5算法对原信息进行数学变换后得到的一个128位(bit)的特征码。

为什么MD5不可逆呢

说白了,MD5就是一种信息摘要的函数,是一种映射关系,但是只能单向映射。比如把一本书的每一页的第一个字笔画记录下来从新排列,得到一串数字,只要是这本书,就是对应这串数字。但是从这串数字,是推算不出这本书的内容的,这就是不可逆的原因。


有些网站上面可以MD5解密,原理其实是让你输入原文和散列值,然后存在数据库里。等你再进行所谓的“解密”时,它搜索一下数据库。然后匹配出这个值,其实单向映射寻找的过程,不是破解。当然也有能破解的,网络上有许多针对MD5破解的专用软件,通过设置字典来进行破解。

有没有可逆的算法

可逆的加密码算法:产生的密码位数由密码本身长度决定

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Security.Cryptography;  
using System.IO;  

namespace GlacierV2.Common  
{  
    public static class Global  
    {  
        private static int _newDBPrimaryKeySeed = 0;  

        #region 加密和解密算法  
        private static SymmetricAlgorithm mobjCryptoService = new RijndaelManaged();  
        /// <summary>     
        /// 获得密钥     
        /// </summary>     
        /// <returns>密钥</returns>     
        private static byte[] GetLegalKey()  
        {  
            string sTemp = "xfsdfgsfgsdgsdfgsdfg";  
            mobjCryptoService.GenerateKey();  
            byte[] bytTemp = mobjCryptoService.Key;  
            int KeyLength = bytTemp.Length;  
            if (sTemp.Length > KeyLength)  
                sTemp = sTemp.Substring(0, KeyLength);  
            else if (sTemp.Length < KeyLength)  
                sTemp = sTemp.PadRight(KeyLength, ' ');  
            return ASCIIEncoding.ASCII.GetBytes(sTemp);  
        }  
        /// <summary>     
        /// 获得初始向量IV     
        /// </summary>     
        /// <returns>初试向量IV</returns>     
        private static byte[] GetLegalIV()  
        {  
            string sTemp = "swetwerehetyeryertyerty";  
            mobjCryptoService.GenerateIV();  
            byte[] bytTemp = mobjCryptoService.IV;  
            int IVLength = bytTemp.Length;  
            if (sTemp.Length > IVLength)  
                sTemp = sTemp.Substring(0, IVLength);  
            else if (sTemp.Length < IVLength)  
                sTemp = sTemp.PadRight(IVLength, ' ');  
            return ASCIIEncoding.ASCII.GetBytes(sTemp);  
        }  
        /// <summary>     
        /// 加密方法     
        /// </summary>     
        /// <param name="Source">待加密的串</param>     
        /// <returns>经过加密的串</returns>     
        public static string Encrypto(string Source)  
        {  
            byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);  
            MemoryStream ms = new MemoryStream();  
            mobjCryptoService.Key = GetLegalKey();  
            mobjCryptoService.IV = GetLegalIV();  
            ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();  
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);  
            cs.Write(bytIn, 0, bytIn.Length);  
            cs.FlushFinalBlock();  
            ms.Close();  
            byte[] bytOut = ms.ToArray();  
            return Convert.ToBase64String(bytOut);  
        }  
        /// <summary>     
        /// 解密方法     
        /// </summary>     
        /// <param name="Source">待解密的串</param>     
        /// <returns>经过解密的串</returns>     
        public static string Decrypto(string Source)  
        {  
            byte[] bytIn = Convert.FromBase64String(Source);  
            MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);  
            mobjCryptoService.Key = GetLegalKey();  
            mobjCryptoService.IV = GetLegalIV();  
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();  
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);  
            StreamReader sr = new StreamReader(cs);  
            return sr.ReadToEnd();  
        }  
        #endregion  

    }  
}  

实现一种知道原始数据,加密可逆;不知道原始数据,加密不可逆

只是一个想法,还没有付诸实践,毕竟不是安全密码加密这方面专精的,只是看了MD5加密之后突然之后又这个想法,然后就有了一个ider。

  • 知道算法就可逆 -> 算法是固定的
  • 散列算法不可逆 -> 消息摘要
  • 算法不固定就无法破解吗 -> 思路

1.
123 =》 MD5 =》 202cb962ac59075b964b07152d234b70
2.
将202cb962ac59075b964b07152d234b70
加密 20299989629799590759896498071521002349870
3.
然后准备0-9套算法,把原始数据按照上面的顺序分别运用算法加密
4.
加密之后,因为不知道原始数据,所以就无法MD5加密,就不知道使用算法加密的过程,就无法完成解密了
但是知道原始数据,就可以MD5加密,然后推出算法过程,就可以完成可逆算法
5.
只是一个想法,过程也不是很详细,希望对这方面有研究的一起研究研究吧

猜你喜欢

转载自blog.csdn.net/q764424567/article/details/80770582
今日推荐