본문 바로가기

iOS

One-Time-Pad

728x90
반응형
SMALL

원타임패드(One-Time Pad)

암호학에서 사용되는 기법입니다. 이 기법은 평문을 암호화하기 위해 키와 평문의 각 비트를 XOR 연산하는 방식으로 작동합니다. 이 때, 키는 평문과 동일한 길이 이상을 가져야 하며, 한 번만 사용할 수 있습니다.

(따라서 이 기법은 '한 번만 사용하는 패드'라는 의미로 '원타임패드'라고 불립니다.)

 

원타임패드는 이론적으로 안전한 암호화 방식으로 알려져 있지만, 실제로는 사용하기 어렵습니다. 이는 키를 안전하게 공유하는 것이 매우 어렵기 때문입니다. 또한, 키의 길이가 평문의 길이 이상이어야 하기 때문에, 큰 파일을 암호화하기에는 매우 비효율적입니다. 그러나 원타임패드는 이론적으로는 안전한 암호화 방식 중 하나이므로, 일부 특수한 경우에는 여전히 사용되기도 합니다.

 

예제코드

import UIKit

class ViewController: UIViewController {
    func encrypt(plainText: String, key: String) -> String {
        let plainTextChars = Array(plainText)
        let keyChars = Array(key)
        var encryptedChars = [Character]()
        
        print("keyChars: \(keyChars)\n")
        
        for i in 0..<plainTextChars.count {
            let plainTextChar = plainTextChars[i]
            let keyChar = keyChars[i]
            let encryptedChar = Character(UnicodeScalar(UInt8(plainTextChar.asciiValue! ^ keyChar.asciiValue!)))
            encryptedChars.append(encryptedChar)
        }
        
        print("encryptedChars: \(encryptedChars)\n")
        return String(encryptedChars)
    }

    func decrypt(encryptedText: String, key: String) -> String {
        let encryptedTextChars = Array(encryptedText)
        let keyChars = Array(key)
        var decryptedChars = [Character]()
        
        for i in 0..<encryptedTextChars.count {
            let encryptedTextChar = encryptedTextChars[i]
            let keyChar = keyChars[i]
            let decryptedChar = Character(UnicodeScalar(UInt8(encryptedTextChar.asciiValue! ^ keyChar.asciiValue!)))
            decryptedChars.append(decryptedChar)
        }
        print("decryptedChars: \(decryptedChars)\n")
        return String(decryptedChars)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let plainText = "Hello, world!"
        let key = "Secretsecretsecretsecret"
        let encryptedText = encrypt(plainText: plainText, key: key)
        let decryptedText = decrypt(encryptedText: encryptedText, key: key)
        print("Decrypted text: \(decryptedText)")
    }
}

print 결과

H 72 S 83 XOR 연산값: 27

e 101 e 101 XOR 연산값: 0

l 108 c 99 XOR 연산값: 15

l 108 r 114 XOR 연산값: 30

o 111 e 101 XOR 연산값: 10

, 44 t 116 XOR 연산값: 88

  32 s 115 XOR 연산값: 83

w 119 e 101 XOR 연산값: 18

o 111 c 99 XOR 연산값: 12

r 114 r 114 XOR 연산값: 0

l 108 e 101 XOR 연산값: 9

d 100 t 116 XOR 연산값: 16

! 33 s 115 XOR 연산값: 82

 

*** H, S 의 XOR 연산 예시 ***

 

1. 72와 83을 2진수로 나타냅니다.

72: 01001000 83: 01010011

 

2. 각 자릿수별로 XOR 연산을 수행합니다.

0 1 0 0 1 0 0 0 ->  64 + 8

0 1 0 1 0 0 1 1  ->  64 + 16 + 2 + 1

---------------

0 0 0 1 1 0 1 1

 

3. 결과를 10진수로 변환합니다.

00011011 = 2^4 + 2^3 + +2^1 + 2^0 = 16 + 8 + 2 + 1 = 27

728x90
반응형
LIST

'iOS' 카테고리의 다른 글

iOS 연속 탭 위치 인식 방법  (0) 2023.05.06
일급 컬렉션  (0) 2023.05.05
Swift XML 파싱  (0) 2023.05.03
객체지향의 역할, 책임 차이 쉬운 예  (0) 2023.05.03
솔리드(SOLID) 원칙  (0) 2023.05.03