2014-02-05 4 views
1

나는 암호화 된 텍스트를 기반으로 사용자에게 몇 가지 정보를 보여줄 프로젝트에서 작업하고 있습니다.위치를 고려하는 대체 암호

나는 암호를 이미 알고있다. 나는 그것을 해독하는 법을 알고있다. 간단한 대체 암호는 알고 있지만이 경우에는 작동하지 않습니다.

코드 0-9와 0-10 만 반복되는 코드가 있습니다. 그래서 기본적으로 숫자로만 이루어진 0-10 문자의 코드입니다. 이 코드는 암호를 통해 실행되고 대문자, 비 대문자 및 숫자의 조합으로 변환됩니다.

충분히 간단하고, 아마도 다시 dechiperer를 써서 숫자로 변환 할 수있을 것입니다. 그러나 이것은 또한 코드에있는 숫자의 위치를 ​​고려합니다.

의미 : 코드 : 1234가 Ar5Q로 변환 될 수 있지만 코드 : 4321은 간단한 대체 암호에서 예상하는 것처럼 Q5rA가 아닌 B6up으로 변환 될 수 있습니다.

누구나 그런 암호를 만드는 방법의 방향을 알려줄 수 있습니까?

그리고 보너스 질문. 테이블이나 사전에서 dechiperer를 생성 할 수 있습니까?

편집 :

enter image description here

코드 : 1234이 될 것이다 :

내가이 테이블이 H8o6

H8o6는 내가받을 문자열과 디코딩이다.

나는 사전을

Dictionary<KeyValuePair<string, int>, int> translator = new Dictionary<KeyValuePair<string, int>, int>(); 

을 만들어이 문제를 해결 그리고이 같은 사전에 모든 항목을 추가 :

translator.Add(new KeyValuePair<string, int>("N", 0), 0); 
     translator.Add(new KeyValuePair<string, int>("H", 0), 1); 
     translator.Add(new KeyValuePair<string, int>("r", 0), 2); 
     translator.Add(new KeyValuePair<string, int>("x", 0), 3); 
     translator.Add(new KeyValuePair<string, int>("Y", 0), 4); 
     translator.Add(new KeyValuePair<string, int>("e", 0), 5); 
     translator.Add(new KeyValuePair<string, int>("z", 0), 6); 
     translator.Add(new KeyValuePair<string, int>("t", 0), 7); 
     translator.Add(new KeyValuePair<string, int>("L", 0), 8); 
     translator.Add(new KeyValuePair<string, int>("l", 0), 9); 
     translator.Add(new KeyValuePair<string, int>("t", 1), 0); 
     translator.Add(new KeyValuePair<string, int>("I", 1), 1); 
     translator.Add(new KeyValuePair<string, int>("8", 1), 2); 
     translator.Add(new KeyValuePair<string, int>("r", 1), 3); 
     translator.Add(new KeyValuePair<string, int>("X", 1), 4); 
     translator.Add(new KeyValuePair<string, int>("K", 1), 5); 

이 그냥 슈퍼 효과 느낀다. 그러나 나는 그것을 할 다른 방법에 대해 내 머리를 얻을 수 없습니다.

Marked Matts 대답.

char[] cipher = ['A','r','5','Q','T','g','6','7','u'] 

그리고 당신은 번호 목록 등을 인코딩하는 :하지만 실제로 내가 찾던 내가 올바르게 이해하고있어 경우에 따라서

+0

확인 - 문자열의 위치 번호를 추가하십시오. 귀하의 질문이 무엇인지 확실하지 않습니다. 당신이이 방향으로 거의 움직이고있는 것처럼 보이기 때문에 배경을 위해 체크 아웃 할 수도 있습니다. http://en.wikipedia.org/wiki/One-time_pad –

+0

@MattBurland 나는 정확하게 내가 말할 수 있으면 좋겠다. keyValuePair는 암호화 된 문자가있는 문자열과 코드의 위치를 ​​나타내는 정수로 구성되며 KeyValuePair가 해당하는 숫자로 나타내는 정수를 구성합니다. 질문을 던지면 더 간단한 방법으로이를 수행 할 수 있습니까? –

+0

좀 더 설명해 주시겠습니까? 당신이 말하는 것을 따라하기가 정말 어렵습니다. 그래서 당신은'Dictionary , int>'을 가졌습니까? 기본적으로, 각 캐릭터가 완전히 다른 암호로 암호화되도록 하시겠습니까? 일회용 패드와 다른 점이 없습니까? –

답변

0

:-) 댓글이, 당신이 뭔가를 가지고 있지만 있어요 이 :이 같은 수행하여

int[] msg = [1,2,3,4]; 

: 다른 말로하면

encoded[i] = cipher[msg[i]-1]; 

을, 당신은 U입니다 msg의 숫자를 암호문의 색인으로 부릅니다.

그래서 위치를 추가하려면 범위 내에서 유지하려면 위치와 mod를 추가하십시오.뭔가 같은 : 그래서

encoded[i] = cipher[(msg[i] - 1 + i) % cipher.length]; 

이제 인코딩 된 메시지가 될 것이다 (나는이 엉망하지 않은 경우 - 나는 내 머리를하고 있어요) :

A 5 T 6 

을 지금, 당신의 아이디어 인 경우 문자열의 각 위치에 대해 완전히 다른 암호를 가지려면 2D 배열이 가장 좋습니다. (정신에 대한 2 개 문자로 단축) 식으로 뭔가 : 다음

char[,] cipher = { 
    { 'A', 'N' }, 
    { 'C', '2' }, 
    { 'a', 'E' } 
} 

당신 것 같은 인덱스를 :

물론
encoded[i] = cipher[i,msg[i]-1]; 

, 이제 배열의 크기가 입니다 확인해야 메시지 길이 x 메시지 문자 범위

관련 문제