Translate

2018년 7월 21일 토요일

암호화

2011년 3월 29일 화요일

해시값 생성

해시값은 digest 라고 불리기도 한다.

#!/usr/bin/ruby

require 'digest/md5'

s = "hello"
puts Digest::MD5.digest(s)
puts Digest::MD5.hexdigest(s)
puts Digest::MD5.base64digest(s) # 1.9.1



Cipher 를 사용한 AES 암호화 예제

# coding: utf-8
require 'openssl'
require 'digest'

# setup
password = 'password'
key = Digest::SHA256.digest password

# encrypt
encipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
encipher.encrypt

# key 길이가 같아야 한다. 길이가 클 경우 큰 부분이 무시되므로 안전하지 않다
# 여기서는 항상 같다
if encipher.key_len == key.length
    encipher.key = key
else
    raise "key length mismatch"
end

# iv 을 설정하지 않을 경우 기본값으로 null 값이 할당된다.
# iv = "\x00" * iv_len

encrypted_text = encipher.update('This is a message.')
encrypted_text << encipher.final

# decrypt
decipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
decipher.decrypt
decipher.key = key
decrypted_text = decipher.update(encrypted_text)
decrypted_text << decipher.final


사용하기 편리하게 String 클래스에 합체해보자.

# coding: utf-8
class String
    # iv 을 설정하지 않을 경우 기본값으로 null 값이 할당된다.
    # iv = "\x00" * iv_len
    def encrypt password
        encipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
        encipher.encrypt
        encipher.key = Digest::SHA256.digest password
        encrypted_text = encipher.update(self)
        encrypted_text << encipher.final
    end

    def decrypt password
        decipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
        decipher.decrypt
        decipher.key = Digest::SHA256.digest password
        decrypted_text = decipher.update self
        decrypted_text << decipher.final
        decrypted_text.force_encoding("utf-8")
    end
end

encrypted_string = "암호화 테스트입니다.".encrypt("password")
decrypted_string = encrypted_string.decrypt("password")

p [encrypted_string, decrypted_string]

댓글 없음:

댓글 쓰기

응용 어플 끝글자 버그 잡는 거 진짜 개쉽습니다

그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유 우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다 . 이렇게 개떡 같은 게 오픈소스입니다. 전 과거 libhwp 하냐고...