2012-01-12 4 views
5

다음과 같은 최상의 솔루션을 만들기 위해 문제가 있습니다. [0 ... N] 범위의 유한 음수가 아닌 정수가 있습니다. 이 집합의 각 숫자를 문자열로 표현하고 이러한 문자열을 원래 숫자로 역으로 변환 할 수 있어야합니다. 따라서 이것은 전체적인 기능이어야합니다.Bijective "Integer <-> String"function

추가 요구 사항은 다음과 같습니다 다수의

  1. String 표현은 적어도 어느 정도 원래의 수를 당황하게한다. f (x) = x.toString()과 같은 원시 솔루션은 작동하지 않습니다.
  2. 문자열 길이는 중요합니다.
  3. K의 문자열 표현을 알고있는 경우, K + 1의 문자열 표현을 추측하는 것이 중요합니다 (어느 정도까지).

p.p.2의 경우 분명한 해결책은 Base64 (또는 모든 값에 맞는 BaseXXX) 표기법을 사용하는 것입니다. 그러나 최소한의 추가 노력으로 p.3에 적합 할 수 있습니까? 상식은 BaseXXX 값에 대한 전체적인 "String < -> String"함수가 추가적으로 필요하다는 것을 알려줍니다. 어떤 제안? 아니면 3 가지 요구 사항을 모두 충족시키기 위해 BaseXXX보다 나은 점이 있습니까?

+0

오른쪽의 '관련'목록에는 여러 가지 유사한 질문이 있습니다. – AakashM

+0

정의에 따르면, 가역적 인 난독 화 함수는 "암호"입니다. 'enc (k)'에서'enc (k + 1)'을 계산할 수 없다는 것은 좋은 암호에 꽤 많이 필요합니다. 만약 당신이 알고 있다면 평문/암호 쌍은 당신에게 평문 근처의 많은 암호문을 줄 것입니다. 당신은 계산할 시간이있었습니다. 그런 질문은 소금을 사용할지 여부와 상관없이 짧은 암호문을 얻기 위해 받아 들일 수있는 암호가 "나쁘다"(또는 값 비싼 계산 방법) 방법이며, 스트리밍 모드. –

+0

스트리밍 모드는 중요하고 중요하지 않습니다. 왜냐하면 암호로 인해 단일 숫자의 표현을 뒤집을 수 없더라도 일련의 긴 숫자를 볼 수 있고 일반 텍스트 데이터의 유포 분포에 대해 조금은 알고있는 공격자 특정 공통 평문 값의 암호화 된 값을 식별하기 위해 주파수 분석, 마르코프 연쇄 분석 등을 수행 할 수 있습니다. 스트리밍 모드가 실패한 예는 http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29를 참조하십시오. –

답변

0

그래서 원래의 번호를 난독하게하는 문자열이 필요하지만 str (K)가 알려졌을 때 str (K + 1)을 결정할 수있게하는 문자열이 필요합니까?

그냥 f(x) = (x + a).toString()을 수행하는 것은 어떨까요? a은 비밀입니까? 그런 다음 외부 사용자가 f(x)에서 x을 확인할 수는 없지만 알 수없는 x에 대해 문자열 "1234"가있는 경우 "1235"는 x+1으로 매핑됩니다.

+1

그는 반대를 원했습니다. 'x + 1'을 * 중요하지 않습니다. –

+0

아, 완전히 잘못 읽었습니다 – Chowlett

1

too 보안이 필요하지 않은 경우 BaseXXX로 인코딩 한 후 간단한 대칭 암호화를 사용할 수 있습니다. 예를 들어 정수 [n1, n2, n3 ...]의 키 시퀀스를 선택한 다음 Vigenere cipher을 사용할 수 있습니다.

암호의 기본 개념은 간단합니다. 각 문자 C를 C + K (mod 26)로 인코딩합니다. 여기서 K는 키의 요소입니다. 계속 진행하면서 다음 문자를 얻기 위해 키의 다음 숫자를 가져 와서 키의 값이 부족하면 줄 바꿈합니다.

실제로 여기에는 두 개의 옵션이 있습니다. 먼저 숫자를 baseXXX의 문자열로 변환 한 다음 암호화하거나 동일한 아이디어를 사용하여 각 숫자를 단일 문자로 암호화 할 수 있습니다. 이 경우 mod 26에서 mod N + 1으로 변경하고 싶을 것입니다.

생각해 보니 더 간단한 옵션은 xor 키와 값의 요소입니다. (Vigenere 공식을 사용하는 것과는 대조적으로) 난 이것이 난독 화를 위해서도 효과가있을 것이라고 생각한다.

+0

Vigenere 암호가 저의 첫 번째 아이디어였습니다. 내가 좀 더 사소한 일을 건너 뛰지 않았다는 자신감을 얻으려고 노력했다 ... –

+0

Heh, 다른 누군가가 나와 같은 생각을 가지고있을 때 항상 좋다 :) –

0

p. 1 및 p. 3은 약간 모순되며 다소 모호합니다.

정수형의 16 진수 표현을 사용하는 것이 좋습니다.

17 => 0x11 
123123 => 1E0F3 
+0

p.1과 p.3가 모순되는 이유는 무엇입니까? 그리고 당신의 솔루션은 확실히 p.3을 위반합니다. –

1

이 방법은 요구 사항 1-3을 충족하지만, 아마도 조금 너무 계산 비용 :

  1. 가 소수 p > N+2을 찾아, 너무 훨씬 더 큰
  2. 원시적 인 루트를 찾을 수g 모듈로 p, 즉 곱셈 순서 모듈로 pp-1
  3. 인 경우인 수, enc(k) = min {j > 0 : g^j == (k+2) (mod p)}
  4. f(k) = enc(k).toString()
1

길이 M의 테이블을 구축 할 수 있습니다. 이 테이블은 숫자 0에서 M-1을 무작위 순서로 다른 짧은 문자열에 매핑해야합니다. 테이블의 문자열을 사용하여 숫자의 숫자를 나타내는 숫자를 기본 숫자 인 M으로 표현하십시오. 직선 반전으로 디코딩.

M=26으로 각 자릿수를 사용할 수 있습니다. 또는 M=256을 가져 와서 각 자릿수에 1 바이트를 사용하십시오.

원격으로는 좋은 암호화 방법이 아닙니다!