[알고리즘] 암호 화 알고리즘: 원시 데 이 터 를 알 고 암호 화 되 돌 릴 수 있 는 방법 을 어떻게 실현 합 니까?원본 데 이 터 를 모 르 면 암호 화 를 거 스 를 수 없습니다.

최근 에 암호 화 알고리즘 을 연구 하고 있 는데 가장 효과 적 인 것 은 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();  
        ///      
        ///          
        ///      
        ///        
        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);  
        }  
        ///      
        ///       IV     
        ///      
        ///     IV     
        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);  
        }  
        ///      
        ///          
        ///      
        ///           
        ///            
        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);  
        }  
        ///      
        ///          
        ///      
        ///           
        ///            
        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 가 생 겼 습 니 다.
  • 알고리즘 을 알 면 되 돌 릴 수 있다 - > 알고리즘 은 고정 적 이다
  • 해시 알고리즘 불가 역 - > 메시지 요약
  • 알고리즘 이 고정 되 지 않 으 면 풀 수 없 나 요 - > 사고방식


  • 123 = MD5 = 202 cb962ac 59075b964b 07152 d234b 70 2. 202 cb962ac 59075b964b 07152 d234b 70 을 202999896799595959595959595959595959595959595959595959595971521002349870 3. 그리고 0 - 9 개의 알고리즘 을 준비 하여 원시 데 이 터 를 위의 순서에 따라 각각 알고리즘 암호 화 4. 암호 화 한 후에 원시 데 이 터 를 모 르 기 때문에 MD5 암호 화 를 할 수 없고 알고리즘 암호 화 과정 을 모른다.복호화 가 완료 되 지 않 지만 원시 데 이 터 를 알 면 MD5 암호 화 를 할 수 있 습 니 다. 그리고 알고리즘 과정 을 내 놓 으 면 가 역 알고리즘 5 를 완성 할 수 있 습 니 다. 하나의 생각 일 뿐 과정 도 상세 하지 않 습 니 다. 이 방면 에 대해 연구 하고 자 하 는 것 이 있 으 면 같이 연구 하 세 요.

    좋은 웹페이지 즐겨찾기