질문 Q #9261
Encrypt 객체 관련 의문점
내일은 2011-03-21 14:23:16
ci 2.0 소스 분석중에 궁금한점이있습니다.

CI_Encrypt 객체의 암호화방식중에 _xor_encode 의 인코딩 방식을 보면

램덤 문자열을 끼워 넣어서 xor 연산을 하는듯합니다

원문이 S 라고 할때 .

랜덤키값 R

키값 K

 (R^K ).(S^R^K) 방식의 암호화 알고리즘을 가지고 있는데 ..문자열을 잘라서 R^K 의 값을 알아낸다면 랜덤 키와

암호화키를 따로 알지못하더라도 

for ($i = 0; $i < strlen($encode_str); $i += 2)
{
$dec .= substr($encode_str, $i, 1) ^ substr($encode_str, $i+1, 1);
}
 
와 같은 방식으로 디코딩이 될것같아서 테스트를 해봤는데 제대로된 결과를 얻지못했습니다.

비트연산의 특성으로 미뤄 봤을때 접근방식만 올바르게 제시를 하면 키값을 알지못하더라도 복호화가 가능한게 아닌가요?

고수님들의 답글을 기다립니다 ..

답변 4
#1 변종원(웅파) 2011-03-21 14:35:34
encoding시  xor 연산후 _xor_merge() 를 이용하여 스트링과 키를 조합하고 있습니다.

_xor_merge()이 없다면 말씀하신 대로 결과값이 나올테지요. 

키값을 알지못해도 복호화가 가능하면 암호화를 할 필요가 없지 않을까요? ^^
#2 내일은 2011-03-21 14:38:15
 제가 비트 연산을 잘못 이해했을수도있습니다 .

(R^K ).(S^R^K) 이부분에 _xor_merge() 부분이 포함된것이 아닌가요?

(R).(S^R) 로 이어진 문장에 ^K 연산을 해서 결과 값이 (R^K ).(S^R^K)이렇게 나온다고 생각했는데 잘못된걸까요? ;;

말씀하신데로 키값을 알지못해도 복호화가 되지 않을까 해서 테스트중입니다 ㅎ;



#3 변종원(웅파) 2011-03-21 18:30:31


말씀하신대로 R^K 값을 잘라낼 수는 있겠지만 어디서부터 그 값인지 알려면..
(알고리즘 짜서 돌리면 되기는 하겠죠. ^^)

그리고 (R^K ).(S^R^K) 이 값과  (R).(S^R) ^K 이 값은 다른 값입니다.

그리고 또 한가지 xor 연산은 서버에 mcrypt가 설치되지 않았을때의 대안입니다.
php설치시 가급적이면 php-mcrypt를 설치하라고 하고 있습니다.

#4 내일은 2011-03-21 18:52:14
 답변 감사합니다 ..
문자열 길이가 일정하지 않은 이유와 같은  이유인듯하네요 .
웅파님 같은 사수한분 계시면 일할맛날것같은데 .. ㅎㅎ

즐거운 하루 되세요 .^^