본문 바로가기
python/파이썬으로게임만들기

파이썬게임만들기-제6장비밀코드풀기-3. 암호화코드, 복호화코드

by 유봉삼 2023. 4. 28.
728x90
반응형

 
파이썬으로 게임만들기 제6장 3번 암호화
책에 있는 예제인데 주석을 달아서 어떻게 계산되는지 체크해놈
파이썬마스터하기 어렵넹 ㅠㅠ
 
 

 

06장 비밀 코드 풀기
06-1 리스트란?
>>>>>>>>>>>2023.04.27 - [python/파이썬으로게임만들기] - 파이썬게임만들기 -6장비밀코드풀기-1.리스트
06-2 루프 안 루프 알아보기
>>>>>>>>>>>2023.04.28 - [분류 전체보기] - 파이썬게임만들기-제6장비밀코드풀기-2.루프
06-3 암호 해독 프로그램 만들기

 


 
기본설명

#암호화
print(ord('A')) #아스키코드 > 65
print(ord('A')+1) #아스키코드 > 66 = B
print(chr(65))
print(chr(ord('A')+1))

#A(65)	B(66)	C(67)	D(68)	E(69)	F(70)	G(71)	H(72)	I(73)	J(74)	K(75)	
#L(76)	M(77)	N(78)	O(79)	P(80)	Q(81)	R(82)	S(83)	T(84)	U(85)	V(86)	
#W(87)	X(88)	Y(89)	Z(90)   공백(32)
print()
#HELLO에 10을 더하면? ROVVY
print(ord('H'),ord('E'),ord('L'),ord('L'),ord('O'))
print(chr(ord('H')+10),chr(ord('E')+10),chr(ord('L')+10),chr(ord('L')+10),chr(ord('O')+10)) 

print()
#암호화 키=314159 로 헬로우를암호화 ,만약 키보다 문자열이 길면 키를 반복
print(chr(ord('H')+3),chr(ord('E')+1),chr(ord('L')+4),chr(ord('L')+1),chr(ord('O')+5))

 

암호화 코드 만들기

#암호화코드만들기
    #아스키범위 
asciimin = 32 #공백
asciimax = 126 #'~'
    #암호화키
key = 314159
key = str(key) #--> 각문자에 접근할수 있도록 key값을 문자로 변환
    #암호화할 메세지 입력받기 ex>암호화할문자를입력하세요:HELLO
message = input("암호화할문자를입력하세요:")
    #암호화메세지용 변수 초기화하기
messEncr = ""
    #메세지루프
for index in range(0,len(message)):
        #해당문자의 아스키값 가져오기
    char = ord(message[index]) 
    #print(char)            #72  <HELLO의 아스키값
                            #69
                            #76
                            #76
                            #79

    if char < asciimin or char > asciimax: # 메세지가 아스키범위에 없다면
        messEncr += message[index] #암호화에 적당하지않음 message값 그대로두기
    else:
        ascNum = char + int(key[index % len(key)]) 
                                        #len(key) = 6, INDEX RANGE (0~4)
                                        #index % len(key) -> 0 % 6 = 0
                                        #                    1 % 6 = 1
                                        #                    2 % 6 = 2
                                        #                    3 % 6 = 3
                                        #                    4 % 6 = 4       
                #char + int(key[index % len(key)]) ->   72 + key[0] = 72 + 3 = 75
                #                                       69 + key[1] = 72 + 1 = 73
                #                                       76 + key[2] = 72 + 4 = 76
                #                                       76 + key[3] = 72 + 1 = 73
                #                                       79 + key[4] = 72 + 5 = 77            
    if ascNum > asciimax:   #암호화된 문자(ascNum)가 126의 ASCII 범위 내에 있는지 확인하는 데 사용
                            #최대 ASCII 값인 126보다  ascNum보다 크면 
        ascNum -= (asciimax - asciimin) # ascNum = ascNum - (asciimax - asciimin)
                                        # ASCII 범위( asciimax - asciimin) 간의 차이를 뺌 
                                        # 이렇게 하면 값이 ASCII 범위 내로 돌아감  
    messEncr = messEncr + chr(ascNum) #chr(ascNum) 의 루프가 입력 메시지의 각 문자를 반복 
                                    #messEncr , messEncr + chr(ascNum)->>     K
                                    #                                       K KF
                                    #                                       KF KFP
                                    #                                       KFP KFPM
                                    #                                       KFPM KFPMT 
                                    #                                       KFPMT     <<< messEncr결과값                                 
print ("암호화한메세지:", messEncr)  
#결과 >>>>암호화한메세지: KFPMT

 
복호화 코드 만들기



#복호화코드만들기
asciimin = 32 #공백
asciimax = 126 #'~'
    #암호화키
key = 314159
key = str(key) #--> 각문자에 접근할수 있도록 key값을 문자로 변환
    #복호화할 메세지 입력받기 ex>복호화할문자를입력하세요:KFPMT
message = input("복호화할문자를입력하세요:")
messEncr = ""
    #메세지루프
for index in range(0,len(message)):
        #해당문자의 아스키값 가져오기
    char = ord(message[index]) 
    #print(char)            #75  <KFPMT의 아스키값
                            #70
                            #80
                            #77
                            #84

    if char < asciimin or char > asciimax: # 메세지가 아스키범위에 없다면
        messEncr += message[index] #복호화에 적당하지않음 message값 그대로두기
    else:
        ascNum = char - int(key[index % len(key)]) 
                                        #len(key) = 6, INDEX RANGE (0~4)
                                        #index % len(key) -> 0 % 6 = 0
                                        #                    1 % 6 = 1
                                        #                    2 % 6 = 2
                                        #                    3 % 6 = 3
                                        #                    4 % 6 = 4       
                #char - int(key[index % len(key)]) ->   75 - key[0] = 75 - 3 = 72
                #                                       70 - key[1] = 70 - 1 = 69
                #                                       80 - key[2] = 80 - 4 = 76
                #                                       77 - key[3] = 77 - 1 = 76
                #                                       84 - key[4] = 84 - 5 = 79            
    if ascNum < asciimin:   #최소 ASCII 값인 32보다  ascNum보다 작으면
        ascNum += (asciimax - asciimin) # ascNum = ascNum + (asciimax - asciimin)
                                        # ASCII 범위( asciimax - asciimin) 간의 차이를 더함 
                                        # 이렇게 하면 값이 ASCII 범위 내로 돌아감  
 
    messEncr = messEncr + chr(ascNum) #chr(ascNum) 의 루프가 입력 메시지의 각 문자를 반복 
                                    #messEncr , messEncr + chr(ascNum)->>   H
                                    #                                       H HE
                                    #                                       HE HEL
                                    #                                       HEL HELL
                                    #                                       HELL HELLO   <<< messEncr결과값                                 
print ("복호화한메세지:", messEncr)

 
암호화 복호화 합치기 (들여쓰기 주의)


#암호화 복호화 합치기

asciimin = 32 #공백
asciimax = 126 #'~'
    #키값
key = 314159
key = str(key)

action = input("암호화(E) 또는 복호화(D) 중 선택하세요 : ").upper().strip()

if action == "E" or action == "암호화":
    message = input("암호화할문자를입력하세요:")
    messEncr = ""
    for index in range(0,len(message)):
        char = ord(message[index]) 
        if char < asciimin or char > asciimax:
            messEncr += message[index] 
        else:
            ascNum = char + int(key[index % len(key)])                
        if ascNum > asciimax:   
            ascNum -= (asciimax - asciimin)
        messEncr = messEncr + chr(ascNum)      
    print ("암호화한메세지:", messEncr) 

if action == "D" or action == "복호화":
    message = input("복호화할문자를입력하세요:")
    messEncr = ""
    for index in range(0,len(message)):
        char = ord(message[index]) 
        if char < asciimin or char > asciimax: 
            messEncr += message[index]
        else:
            ascNum = char - int(key[index % len(key)])    
        if ascNum < asciimin:  
            ascNum += (asciimax - asciimin)  
        messEncr = messEncr + chr(ascNum)
    print ("복호화한메세지:", messEncr)

 

728x90
반응형