2013-05-14 3 views
0

형식이 xxxxx-xxxxx-xxxxx (15 자) 인이 직렬 키 일을합니다. 나는 현재 내 문자열을 암호화 할 수 있지만 문제는 다음과 같습니다문자열을 15 자로 암호화합니다.

  1. 6 문자는 20 개 이상의 문자된다.
  2. 는 다음과 같은 몇 가지 underieable 문자를 가지고 : +, /, =

그래서 문자의 특정 번호로 문자열을 암호화하는 가장 좋은 방법이 있을까요? 필자의 경우 : 6 글자를 15 글자로 암호화.

나는 현재이 같은 것을 사용하고 있습니다 : 모든

public string EncryptString(string clearText, string Password) 
    { 
     byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText); 
     Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(Password, ByteGetter(UsageMode, "Password")); 
     byte[] encryptedData = EncryptByte(clearBytes, pdb.GetBytes(32), pdb.GetBytes(16)); 
     return Convert.ToBase64String(encryptedData); 
    } 


    public static byte[] EncryptByte(byte[] clearData, byte[] Key, byte[] IV) 
    { 
     MemoryStream ms = new MemoryStream(); 
     Rijndael alg = Rijndael.Create(); 
     alg.Key = Key; 
     alg.IV = IV; 
     CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write); 
     cs.Write(clearData, 0, clearData.Length); 
     cs.Close(); 
     byte[] encryptedData = ms.ToArray(); 
     return encryptedData; 
    } 
+3

Pedantic aside : 알고리즘을 역전시킬 수 없다면 암호화 이상의 것입니다. 그래서 나는 해시 함수 (PBKDF2를 하나의 것으로 간주 할 수 있음)를 사용하고, 입력 데이터를 해시 한 후 Base64 대신 Base32를 사용하여 인코딩 한 후 무의미한 암호화 단계를 건너 뛰고 폐기하는 것이 좋습니다. 여분의 문자는 필요하지 않습니다. – millimoose

+0

알고리즘을 취소하고 싶습니다. 댓글 주셔서 감사합니다. – JohnC1

+2

알고리즘을 취소하려면 데이터를 삭제하거나 출력을 고정 된 크기로 제한 할 수 없습니다. – millimoose

답변

0

. 암호화 알고리즘이 제공하는 것은 무엇이든간에 당신은 붙어있어 보통 고정 된 크기의 블록에서 작동합니다.

ASCII 문자의 무리로 암호화 된 데이터를 인코딩하기위한 분명한 선택

은 다음과 같습니다

  • base64로 - 광범위하게 지원하지만, 단지 알파벳과 숫자를 사용하여 구현 될 수 없으며, 대소 문자를 구분
  • base32 - 다소 모호합니다. 구현을 작성하거나 찾아야합니다. RFC-specified 표준에는 = 초의 패딩이 필요합니다. base16보다 컴팩트하고 만 사람들이 손으로 코드를 입력 할 것으로 예상되는 경우 장점 인 데이터에 대한 대소 문자를 구별하지 영숫자 필요 (가 base64로. 위해하는 것처럼).
  • base16 - 또한 아주 잘 지원은 패딩을 필요로하지 않습니다,하지만 훨씬 적은 소형 다른 두보다 않았다.

당신은 인코딩 된 문자열의 길이가 base32 8의 배수하는 것을 알고 패딩 문제, 그리고 64 기수에 대한 의 배수를 해결할 수 있습니다. (나는 이것에 대해 100 % 확신하지는 않지만 인코딩 된 문자열을 8 비트의 배수로 나타내기를 원하기 때문에 의미가있다.) 이것을 알고 있으면 패딩 문자를 추가하여 잘못된 입력 길이에 대해 불평을 멈추게 할 수있다. (Convert.FromBase64String() 불평 않습니다.)

를 일부 특정 방식으로 입력 크기 주어진 출력 크기를 제한 할, 그리고 (대신 암호화 즉, 해시) 데이터를 폐기하고자하지 않은 경우, 당신은 롤해야 당신의 자신의 암호화 알고리즘. 이것은 대부분 비생산적인 것처럼 보입니다.당신의 요구 사항을

0

첫째, 비 알파 문자를 포함하는 Base64로 인코딩의 한 속성입니다. 따라서 다른 인코딩을 선택해야합니다. 5 비트 구획을 사용하고 A-Z, 2-9로 인코딩하려면 O를 사용하지 않을 수 있습니다. 이렇게하면 원하는 캐릭터 세트를 얻을 수 있습니다.

둘째, 당신은 5 개 비트 패킷을 선택 않는 가정하면, 당신은 5 * 15 = 75 비트가 필요합니다. 대부분의 해시는 128 비트를 더 많이 생성하므로 다운 샘플링해야합니다. 이것을 접근 할 수있는 방법은 단순히 비트를 무시하는 것입니다. 직렬 코드 (역으로) 암호화 된 데이터 싶은 경우에, 당신은 정말 잘 크기를 제한 할 수

: 질문에서 주석 스레드를 Synthetising

0

당신이 필요합니다 : 기본 32 DES

  • 인코딩과

    • 암호화 그러나 당신이 좋아하는
    • 패드 (베이스 (16)는 16 바이트 대신 15 줄 것이다)
  • 관련 문제