$ cat test.txt
hello world!

Examples

help

$ openssl -h        # -h 옵션은 없지만 잘못된 옵션이기 때문에 도움말을 볼 수 있다.
$ openssl dgst -h

sha256

$ echo 'hello world!' | openssl sha256
$ openssl dgst -sha256 input.txt
$ cat input.txt | openssl sha256

aes256

encrypt

$ echo 'hello world!' | openssl aes-256-cbc -a
$ echo 'hello world!' | openssl aes-256-cbc -a -salt    # with salt
$ openssl aes-256-cbc -a -salt -in input.txt -out output.enc

decrypt

$ openssl aes-256-cbc -d -a -in result.enc
$ echo 'U2FsdGVkX18XbxUsGJ7tvr78efIxek8++Tbovib24Ec=' | openssl aes-256-cbc -a -d   # hello world!

base64

encrypt

$ echo 'hello world!' | openssl base64
$ openssl enc -base64 -in input.txt

decrypt

$ echo 'aGVsbG8gd29ybGQhCg==' | openssl base64 -d   # hello world!

소수 관련 기능

$ openssl prime             # 도움말
$ openssl prime 997                 # 997 이 소수인지 조사한다
$ openssl prime -hex ff0            # ff0 이 소수인지 조사한다
$ openssl prime -generate -bits 16  # 랜덤으로 16 비트 소수 생성

경험

KG 이니시스 개발가이드 예제

KG 이니시스 개발가이드 - INIAPI(취소포함)

주어진 PlainText 01011112222aes-cbc-128을 사용해 암호화해보자. 암호화된 결과는 5l8uENBFbTe50/9F3/7o0g== 여야 한다.

예제에서 제공하고 있는 INIAPI key와 INIAPI iv1는 각각 ItEQKi3rY7uvDS8lHYb3yQ4f65QL89== 이다. 이 값들을 openssl에서 사용하기 위해 16진수로 변환해주자. 변환은 xxd -ps 명령을 사용하면 된다.

$ printf ItEQKi3rY7uvDS8l | xxd -ps
497445514b693372593775764453386c

$ printf HYb3yQ4f65QL89== | xxd -ps
48596233795134663635514c38393d3d

정리해보면 다음과 같다.

HEX
INIAPI key ItEQKi3rY7uvDS8l 497445514b693372593775764453386c
INIAPI iv HYb3yQ4f65QL89== 48596233795134663635514c38393d3d

이제 이 값을 사용해 암호화를 해보자. -K에 키를 지정해주고 -iv에 iv를 지정해주면 된다.

$ printf "01011112222" \
    | openssl aes-128-cbc -e \
        -K "497445514b693372593775764453386c" \
        -iv "48596233795134663635514c38393d3d" \
        -a -A

5l8uENBFbTe50/9F3/7o0g==

또는 이렇게 해도 된다.

$ printf "01011112222" \
    | openssl enc -aes-128-cbc \
        -K "497445514b693372593775764453386c" \
        -iv "48596233795134663635514c38393d3d" \
        -a -A

5l8uENBFbTe50/9F3/7o0g==

결과 디코딩도 해보자.

$ printf "5l8uENBFbTe50/9F3/7o0g==" \
    | openssl enc -aes-128-cbc \
        -K "497445514b693372593775764453386c" \
        -iv "48596233795134663635514c38393d3d" \
        -a -A -d

01011112222

잘 나온다.

이제 ItEQKi3rY7uvDS8lIssueReceipt20191128121211123.123.123.123INIpayTest10001001005l8uENBFbTe50/9F3/7o0g==를 이어붙인 평문을 SHA512로 해싱해보자.

$ printf "ItEQKi3rY7uvDS8lIssueReceipt20191128121211123.123.123.123INIpayTest10001001005l8uENBFbTe50/9F3/7o0g==" | openssl sha512

e55083c6e4d492b0f4c3f3145348c20d9d9d8fbafbe530245e77ea4db824d81a412073195f86110224568c613efd146bada7755b2113fa94a82007ce1795e8c8

잘 나온다.

주석

  1. initialization vector. cbc 방식에서 cbc는 "cipher-block chaining" 이므로 블록 체인 방식을 말한다. iv는 여기에서 첫번째 블록을 암호화할 때 사용하는 값이다.