2015-01-29 5 views
0

사용자의 입력 코드를 암호화하는 암호화 프로그램을 코딩하려고합니다. 이것이 단어 문자열 인 경우. 암호화 방법은 타원 곡선 암호화의 기본적인 사용법이며 현재는 수학, 역 모듈 등을 작업하기 전에 프로그램의 암호화 부분에서 작업하고 있습니다. 공개 키 및 개인 키 계산에 필요합니다. 현재 pub = 5 키와 max 값 (2 개의 임의 소수의 곱에서 파생 됨)을 91으로 사용하고 있습니다. 이것은 필요한 모든 정보이며 암호화를 테스트하는 단어는 '행복'합니다.파이썬 암호화 프로그램 (ECC)

여기까지 코드가 있습니다.

word = 'happy' 
pub = 5 
m = 91 

for i in range(pub): 
    if i == 0: 
     word = word 

    else: 
     word = output 

    for x in word: 
     a = [(((ord(z)*ord(z))+1)/m) for z in word] 
     b = [chr(i) for i in a] 
     c = [str(i) for i in b] 
     d = ''.join([str(i) for i in c]) 
     output = d 

내가 뭘하려고 오전 그 자체로도 속해있는 ASCII 값을 곱하여 각 문자를 암호화 한 후 m로 나누어 다음 1을 추가하는 과정 후 문자열을 다시 가입 할 수 chr() 함수를 사용하여 만드는 것입니다 새로운 단어. 그런 다음 새 문자열을 사용하여 루프의 다음주기에 대해 word의 값으로 설정하십시오. 그러면 술어가 완료되고 단어가 암호화 될 때까지 프로세스가 계속됩니다. 나는 이것으로 많은 어려움을 겪고 있으며 문제를 설명하는 것으로부터 어디서부터 시작해야할지 모른다. 저는 파이썬에 비교적 익숙하지 않습니다. 그리고이 제안을 빨리 끝내는 것에 대한 제안이나 조언은 대단히 감사하겠습니다. 미리 감사드립니다.

+0

출력이는 "CHR()가 범위 내에 있지 arg를 (256)" – Brayden

답변

0

먼저 수학이 올바른지 확인하십시오. 귀하의 수식 (z ** 2 + 1)/m은 2 차적으로 커집니다. 암호에 대한 나의 이해는 매우 제한적이지만, 나에게 맞지는 않습니다. 그것은 입력에서 출력까지 일대일 매핑의 일종이어야합니다. 그러나 여러 인접 문자를 동일한 출력으로 매핑합니다. 또한 매 라운드마다 결과가 커집니다.

최대 256 자 범위의 ASCII 문자 만 다시 정수로 변환 할 수 있습니다. 오류 메시지에 표시되는 내용입니다. 그것은 아마 for 루프의 두 번째 반복에서 throw됩니다. 값 범위를 다시 256으로 낮추어야 할 수도 있습니다. 구현하려고하는 알고리즘에서 중요한 부분을 놓친 것 같습니다. 아마도 일부 모듈러스 연산 일 것입니다. 또한

약간의 파이썬 힌트 : 두 번) (ORD을 평가 할 필요가 없습니다

당신은이 ** 전원 연산자에 내장 할 수 있습니다. 당신은 이런 한 단계로 다시 문자열로 변환 할 수 있습니다

((ord(z) ** 2) + 1)/m 

:에 대한 I이 실행하면

output = ''.join([str(chr(i)) for i in a]) 
+0

감사합니다 회신, 각 루프 큰 숫자는 최대 값 주위에 '래핑'해야하지만 나는 그것을 코드하는 방법을 전혀 모른다. 종이에 나는이 과정을 할 수 있지만 코드에서는 어렵다. – Brayden