2012-10-03 1 views
0

RSA 암호화/해독에 유용한 매우 큰 숫자를 처리 할 수 ​​있으므로 Sage 프로그래밍을 배우기로 결정했습니다.현자 프로그래밍의 ZZ 함수

(1) 나는 예제를 따르고 있었지만 ZZ() 함수 내부에서 100을 얻은 방법을 잘 모르겠습니다.

(2) 또 다른 질문은 sage 함수를 사용하여 정수에서 일반 텍스트로 이동하는 방법이 있습니까?

sage: m = "HELLOWORLD" 
sage: m = map(ord, m); m 
[72, 69, 76, 76, 79, 87, 79, 82, 76, 68] 
sage: m = ZZ(list(reversed(m)), 100) ; m   <------ this line 
72697676798779827668 


sage: m = 72697676798779827668 
sage: c = 630913632577520058415521090 
sage: d = 4460824882019967172592779313 
sage: n = 4951760154835678088235319297 
sage: power_mod(c, d, n) 
72697676798779827668    <--- how do i convert this number back to plain text 
sage: power_mod(c, d, n) == m 
True 

답변

2

100은 목록의 각 요소에 대해 얼마나 큰가를 나타냅니다. 그것을 "기본 100"이라고 생각하십시오.

sage: ZZ([1,2,3],100) 
30201 
sage: ZZ([1,2,3],2) 
17 
sage: ZZ([1,2,3],10) # 1*10^0+2*10^1+3*10^2 
321 

This questionord부터 거꾸로 갈 수있는 엄청나게 많은 방법이있다. 그런 다음 chr을 사용합니다.

sage: a = 72697676798779827668 
sage: ''.join([chr(int(str(a)[i:i+2])) for i in range(0, len(str(a)), 2)]) 
'HELLOWORLD' 

나는 이것이 가독성에 이상적이 아니란 점에 동의합니다. 사실, Sage는 crypto module에서 교육학적인 기초 위에서 암호를 수행하는 다른 내장 된 방법을 가지고 있습니다. 거기에는 알파벳을위한 내장 된 것들도 있습니다. (나는 이것이 현재 만들고있는 RSA의 강력한 기능의 버전이 아니라고 추정합니다.)

+0

어떻게해야 기본을 결정할 수 있습니까? 내 문제는 내 m이 매우 큽니다. m은 350 자이고 2x350 = 700 정수로 변합니다. 기본 100을 사용하려고했으나 올바른 숫자가 누출되지는 않습니다. – jaymeister

+0

쉽게 알파벳 26 글자를위한 충분한 공간이 있습니다. 이것은 장난감의 예임을 기억하십시오. 즉, 문자열을 깔끔하게 분해 할 수 있기 때문에 100은 정상적으로 작동해야합니다. 일반적으로 편지를 다시 받으려면 좀 더 복잡한 작업을해야합니다. – kcrisman

관련 문제