2010-08-06 2 views
0

문자열 (0, 1, 2, ...)을 문자열로 인코딩 할 암호화/암호 해독 기능을 찾고 있습니다. 이러한 문자열은 무작위로 보이고 나중에 문자열에서 암호를 해독 할 수 있습니다.문자열에서 코드 번호를 지정하고 나중에 코드를 디코딩하는 방법은 무엇입니까?

예 : 3은 ABFQWEMasdEE로 암호화되고 6은 poad_Asd # @ sad로 암호화됩니다.

암호화 된 문자열의 문자 수와 거기에 나타날 수있는 문자를 제어 할 수 있다면 좋을 것입니다.


UPDATE I이 용액 결국

:

<?php  

$key = 'secret_password'; 

for ($i = 100; $i < 110; $i++) { 
    $text = "$i"; 
    $encrypted = encrypt($text, $key); 
    $decrypted = decrypt($encrypted, $key); 
    $decrypted = rtrim($decrypted, "\0"); 
    $ok = ($text === $decrypted); 
    if (!$ok) { 
     exit('********** BUG BUG BUG BUG BUG ***********'); 
    } 
    echo '[' . $text . '] [' . $encrypted . '] [' . $decrypted . '] ' . ($ok ? 'OK' : 'BUG BUG BUG BUG BUG BUG BUG') . '<br />'; 
} 
exit('***** OK ******'); 

function encrypt($data, $key) {  
    $td = mcrypt_module_open('cast-256', '', 'ecb', ''); 
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    mcrypt_generic_init($td, $key, $iv); 
    $encrypted_data = mcrypt_generic($td, $data); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
    return base64_encode($encrypted_data); 
} 

function decrypt($encoded_64, $key) { 
    $td = mcrypt_module_open('cast-256', '', 'ecb', ''); 
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    mcrypt_generic_init($td, $key, $iv); 
    $decrypted_data = mdecrypt_generic($td, base64_decode($encoded_64)); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
    return $decrypted_data; 
} 

?> 

다음 출력 제공

[100] [9UA0Maq3MGp0CzMOWcpOpg ==] [100] OK
[101] [Y5WKH7J1 + k0bFqsGw1jmrA ==] OK
(210) [102] == NqV2opJc7CNq5O3lcuWKMw] [102] OK
[103] + 1FpJhHe vrK6aKA54VR53Q ==] [103] OK
[104] == MHQoYCqL4yCI9jKg1U0UYw] [104] OK
[105] [6Qq9aXEn46xpDgv8CvnK7Q ==] [105] OK
[106] [UGk1/byT7wpoFM59Uy/PDG ==] [106] OK
[107] == 39kyPA49zAZsCFx3pt6bYw] [107] OK
[108] == YccDSimEf3C0NKDaVOf4kA] 108] OK
[109] + PfmvLfVR4 gi9y9v/6efZQ ==] [109]
OK OK ***** ******

랜덤 문자열이 보인다 (제외한 0,123,303,399,341 끝에)와 같은 크기의 모든. 완벽한 솔루션은 아니지만 충분히 훌륭합니다!

감사합니다.

+1

임의 길이 입력을 고정 길이 출력으로 변환하는 것은 일반적으로 암호화 기능이 아닌 * 해시 함수 *의 속성입니다. – deceze

+1

해시 함수는 일반적으로 전체 효과가 아닙니다. 그는 되돌릴 수있는 것을 원한다. – Amadan

+2

@Amadan 예. 가역 암호화는 일반적으로 고정 길이가 아닙니다. – deceze

답변

2

PHP의 암호화 함수 (mcrypt) 중 하나를 사용하여 데이터를 암호화 한 다음 base64_encode을 사용하여 텍스트로 보낼 수있는 문자열로 인코딩 할 수 있습니다.

0

Crypt_XXTEA 배 패키지를 살펴보십시오. 임의의 문자열을 암호화/해독 할 수 있습니다. 그것은 XXTEA 블록 암호 알고리즘을 사용합니다 (Wikipedia의 XXTEA 참조). "멋진"형식을 원하면 인코딩 된 출력을 추가로 uuencode 할 수 있습니다.

+2

Rijndael (AES)과 같은 입증 된 체계를 사용할 수있는 이유는 무엇입니까? XXTEA가 나쁘지는 않다는 말은 아니지만 AES와 마찬가지로 전투 테스트를 거친 것이 아닙니다. – NullUserException

0

rot13과 같은 간단한 것을 사용하고 각 숫자에 여분의 문자 세트를 추가하십시오. 네, 이것은 매우 약한 형태의 암호화이지만 질문을 해결하고 원하는 결과물을 일치시킬 수 있습니다.

사용자가 좀 더 복잡한 것을 원하면 tweber의 대답을 사용해보십시오. 그렇지만 문자열 출력의 길이 나 임의성을 실제로 제어 할 수 없습니다.

+1

polyalphabetic 암호는 * 끔찍한 * 아이디어입니다. – NullUserException

관련 문제