2016-10-20 4 views
1

32에서 암호화의 ASCII 범위를 제한하는 방법을 알고 있습니다.시저 암호화 및 복호화 C++

나는 현재 암호화

int value = (value-32+shift)%95+32 //value is the current ascii value of a     
            //character 
            //the first shift is given by the user with regards 
            //to how many shifts he wants to do to the right 

이 사용하고이 암호 해독에

int value = (value-32-shift)%95+32 

내 암호화는 완벽하게 (필자는 암호 해독 기능을 인용 할 때)가 작동 중이하지만 내 암호 해독이 작동하지 않습니다 그것이 어땠는지.

추가 참고 : 인코딩, 하나의 문자열을 암호화하고 해독하는 데 우리의 전체 프로그램 주어 졌을 때 우리는 단지 오른쪽 시프트를해야 할 ("이는 C++")

Give shift: 3 
Wklv#lv#F.. 
DECODE 
Wklv#lv#F.. //must be 'THIS is C++' 
ENCODE  //shift=15 
This is C++ //must be 'cwx#/x#/R::' 
DECODE 
EYZdpZdp4{{ //must be 'THIS is C++' 
ENCODE  //shift=66 
cwx#/x#/R:: //must be "8LMWbMWb'mm" 
DECODE 
This is C++ 
ENCODE  //shift=94 
cwx#/x#/R:: //must be 'SGHR~hr~B**' 
DECODE 
This is C++ 

참고 :의 과정에서 코드 설명 추가

+0

[mcve]가 필요합니다. 거기에 "최소"를 적어 두십시오. 우리는 단지 * 하나의 * 고정 교대, 당신이 기대하는 결과 및 당신이 얻는 결과를보고 싶습니다. –

답변

2

문제는 Modulo operator with negative values에 설명되어 있습니다. 나는 이것이 정확히 똑같은 것인지 확신하지 못한다. 문제는 '!'와 같은 암호 문자를 해독하는 것입니다. 두 개 이상 (예 : '3')으로 변합니다.

int value = (value-32-shift)%95+32 
      = ('!'-32-3)%95+32 
      = (33-32-3)%95+32 
      = (-2)%95 + 32 
      = -2 + 32 
      = 30 

죄송합니다.

int value = (value-32+(95-shift))%95+32 
2

probelm는 (value-32-shift) 부정적이 될 수 있다는 것입니다 : 당신은 사용해야합니다. 모듈러스 연산은 '랩 어라운드'하지 않지만 실제로는 '미러링'합니다 (이유를 알고 싶다면 this question and answer 참조). 값을 양수로 유지하려면 모듈로 연산을 수행하기 전에 95를 더하십시오.

int value = (value-32-shift+95)%95+32 
관련 문제