OpenSSLでファイルを暗号化・複合化する方法、ファイルのハッシュ値を取得する方法

OpenSSLで、ファイルを暗号化・複合化、ファイルのハッシュ値を取得をコマンドで実行したてみたので、メモとして残します。

# 環境
+ OS：CentOS Linux release 8.5.2111
+ OpenSSL：OpenSSL 1.1.1k  FIPS 25 Mar 2021

```console:実行結果
[root@centos85 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos85 ~]# openssl version
OpenSSL 1.1.1k  FIPS 25 Mar 2021
[root@centos85 ~]#
```

# 0. OpenSSLで使えるアルゴリズムの確認

まずは`openssl list help`で`openssl list`コマンドのヘルプを参照してみます。
```console:実行結果
[root@centos85 ~]# openssl list -help
Usage: list [options]
Valid options are:
 -help                   Display this summary
 -1                      List in one column
 -commands               List of standard commands
 -digest-commands        List of message digest commands
 -digest-algorithms      List of message digest algorithms
 -cipher-commands        List of cipher commands
 -cipher-algorithms      List of cipher algorithms
 -public-key-algorithms  List of public key algorithms
 -public-key-methods     List of public key methods
 -disabled               List of disabled features
 -missing-help           List missing detailed help strings
 -options val            List options for specified command
[root@centos85 ~]#
```

ヘルプを見るに暗号化・複合化、ハッシュ値に関するものは以下の通り。
|オプション|内容|
|:---|:---|
|-digest-commands|ハッシュ関数に関するコマンドのリスト|
|-digest-algorithms|サポートされているハッシュ関数アルゴリズムのリスト|
|-cipher-commands|暗号化および復号化に関するコマンドのリスト|
|-cipher-algorithms|サポートされている暗号化アルゴリズムのリスト|
|-public-key-algorithms|サポートされている公開鍵暗号アルゴリズムのリスト|
|-public-key-methods|サポートされている公開鍵操作メソッドのリスト|

`public-key-commands`がないのは、公開鍵関連のコマンドが公開鍵アルゴリズムごとにサブコマンドとなっているからだろうと推測しています。

`openssl list -digest-commands`を実行すると以下の通り。
```console:実行結果
[root@centos85 ~]# openssl list -digest-commands
blake2b512        blake2s256        gost              md2
md4               md5               rmd160            sha1
sha224            sha256            sha3-224          sha3-256
sha3-384          sha3-512          sha384            sha512
sha512-224        sha512-256        shake128          shake256
sm3

[root@centos85 ~]#
```

`openssl list -digest-algorithms`を実行すると以下の通り。
```console:実行結果
[root@centos85 ~]# openssl list -digest-algorithms
RSA-MD4 => MD4
RSA-MD5 => MD5
RSA-RIPEMD160 => RIPEMD160
RSA-SHA1 => SHA1
RSA-SHA1-2 => RSA-SHA1
RSA-SHA224 => SHA224
RSA-SHA256 => SHA256
RSA-SHA3-224 => SHA3-224
RSA-SHA3-256 => SHA3-256
RSA-SHA3-384 => SHA3-384
RSA-SHA3-512 => SHA3-512
RSA-SHA384 => SHA384
RSA-SHA512 => SHA512
RSA-SHA512/224 => SHA512-224
RSA-SHA512/256 => SHA512-256
RSA-SM3 => SM3
BLAKE2b512
BLAKE2s256
id-rsassa-pkcs1-v1_5-with-sha3-224 => SHA3-224
id-rsassa-pkcs1-v1_5-with-sha3-256 => SHA3-256
id-rsassa-pkcs1-v1_5-with-sha3-384 => SHA3-384
id-rsassa-pkcs1-v1_5-with-sha3-512 => SHA3-512
MD4
md4WithRSAEncryption => MD4
MD5
MD5-SHA1
md5WithRSAEncryption => MD5
ripemd => RIPEMD160
RIPEMD160
ripemd160WithRSA => RIPEMD160
rmd160 => RIPEMD160
SHA1
sha1WithRSAEncryption => SHA1
SHA224
sha224WithRSAEncryption => SHA224
SHA256
sha256WithRSAEncryption => SHA256
SHA3-224
SHA3-256
SHA3-384
SHA3-512
SHA384
sha384WithRSAEncryption => SHA384
SHA512
SHA512-224
sha512-224WithRSAEncryption => SHA512-224
SHA512-256
sha512-256WithRSAEncryption => SHA512-256
sha512WithRSAEncryption => SHA512
SHAKE128
SHAKE256
SM3
sm3WithRSAEncryption => SM3
ssl3-md5 => MD5
ssl3-sha1 => SHA1
whirlpool
[root@centos85 ~]#
```

`openssl list -cipher-commands`を実行すると以下の通り。
```console:実行結果
[root@centos85 ~]# openssl list -cipher-commands
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb
aria-128-ofb      aria-192-cbc      aria-192-cfb      aria-192-cfb1
aria-192-cfb8     aria-192-ctr      aria-192-ecb      aria-192-ofb
aria-256-cbc      aria-256-cfb      aria-256-cfb1     aria-256-cfb8
aria-256-ctr      aria-256-ecb      aria-256-ofb      base64
bf                bf-cbc            bf-cfb            bf-ecb
bf-ofb            camellia-128-cbc  camellia-128-ecb  camellia-192-cbc
camellia-192-ecb  camellia-256-cbc  camellia-256-ecb  cast
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb
cast5-ofb         des               des-cbc           des-cfb
des-ecb           des-ede           des-ede-cbc       des-ede-cfb
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb
des-ede3-ofb      des-ofb           des3              desx
idea              idea-cbc          idea-cfb          idea-ecb
idea-ofb          rc2               rc2-40-cbc        rc2-64-cbc
rc2-cbc           rc2-cfb           rc2-ecb           rc2-ofb
rc4               rc4-40            rc5               rc5-cbc
rc5-cfb           rc5-ecb           rc5-ofb           seed
seed-cbc          seed-cfb          seed-ecb          seed-ofb
zlib

[root@centos85 ~]#
```

`openssl list -cipher-algorithms`を実行すると以下の通り。
```console:実行結果
[root@centos85 ~]# openssl list -cipher-algorithms
RC5 => RC5-CBC
AES-128-CBC
AES-128-CBC-HMAC-SHA1
AES-128-CBC-HMAC-SHA256
id-aes128-CCM
AES-128-CFB
AES-128-CFB1
AES-128-CFB8
AES-128-CTR
AES-128-ECB
id-aes128-GCM
AES-128-OCB
AES-128-OFB
AES-128-XTS
AES-192-CBC
id-aes192-CCM
AES-192-CFB
AES-192-CFB1
AES-192-CFB8
AES-192-CTR
AES-192-ECB
id-aes192-GCM
AES-192-OCB
AES-192-OFB
AES-256-CBC
AES-256-CBC-HMAC-SHA1
AES-256-CBC-HMAC-SHA256
id-aes256-CCM
AES-256-CFB
AES-256-CFB1
AES-256-CFB8
AES-256-CTR
AES-256-ECB
id-aes256-GCM
AES-256-OCB
AES-256-OFB
AES-256-XTS
aes128 => AES-128-CBC
aes128-wrap => id-aes128-wrap
aes192 => AES-192-CBC
aes192-wrap => id-aes192-wrap
aes256 => AES-256-CBC
aes256-wrap => id-aes256-wrap
ARIA-128-CBC
ARIA-128-CCM
ARIA-128-CFB
ARIA-128-CFB1
ARIA-128-CFB8
ARIA-128-CTR
ARIA-128-ECB
ARIA-128-GCM
ARIA-128-OFB
ARIA-192-CBC
ARIA-192-CCM
ARIA-192-CFB
ARIA-192-CFB1
ARIA-192-CFB8
ARIA-192-CTR
ARIA-192-ECB
ARIA-192-GCM
ARIA-192-OFB
ARIA-256-CBC
ARIA-256-CCM
ARIA-256-CFB
ARIA-256-CFB1
ARIA-256-CFB8
ARIA-256-CTR
ARIA-256-ECB
ARIA-256-GCM
ARIA-256-OFB
aria128 => ARIA-128-CBC
aria192 => ARIA-192-CBC
aria256 => ARIA-256-CBC
bf => BF-CBC
BF-CBC
BF-CFB
BF-ECB
BF-OFB
blowfish => BF-CBC
CAMELLIA-128-CBC
CAMELLIA-128-CFB
CAMELLIA-128-CFB1
CAMELLIA-128-CFB8
CAMELLIA-128-CTR
CAMELLIA-128-ECB
CAMELLIA-128-OFB
CAMELLIA-192-CBC
CAMELLIA-192-CFB
CAMELLIA-192-CFB1
CAMELLIA-192-CFB8
CAMELLIA-192-CTR
CAMELLIA-192-ECB
CAMELLIA-192-OFB
CAMELLIA-256-CBC
CAMELLIA-256-CFB
CAMELLIA-256-CFB1
CAMELLIA-256-CFB8
CAMELLIA-256-CTR
CAMELLIA-256-ECB
CAMELLIA-256-OFB
camellia128 => CAMELLIA-128-CBC
camellia192 => CAMELLIA-192-CBC
camellia256 => CAMELLIA-256-CBC
cast => CAST5-CBC
cast-cbc => CAST5-CBC
CAST5-CBC
CAST5-CFB
CAST5-ECB
CAST5-OFB
ChaCha20
ChaCha20-Poly1305
des => DES-CBC
DES-CBC
DES-CFB
DES-CFB1
DES-CFB8
DES-ECB
DES-EDE
DES-EDE-CBC
DES-EDE-CFB
des-ede-ecb => DES-EDE
DES-EDE-OFB
DES-EDE3
DES-EDE3-CBC
DES-EDE3-CFB
DES-EDE3-CFB1
DES-EDE3-CFB8
des-ede3-ecb => DES-EDE3
DES-EDE3-OFB
DES-OFB
des3 => DES-EDE3-CBC
des3-wrap => id-smime-alg-CMS3DESwrap
desx => DESX-CBC
DESX-CBC
id-aes128-CCM
id-aes128-GCM
id-aes128-wrap
id-aes128-wrap-pad
id-aes192-CCM
id-aes192-GCM
id-aes192-wrap
id-aes192-wrap-pad
id-aes256-CCM
id-aes256-GCM
id-aes256-wrap
id-aes256-wrap-pad
id-smime-alg-CMS3DESwrap
idea => IDEA-CBC
IDEA-CBC
IDEA-CFB
IDEA-ECB
IDEA-OFB
rc2 => RC2-CBC
rc2-128 => RC2-CBC
rc2-40 => RC2-40-CBC
RC2-40-CBC
rc2-64 => RC2-64-CBC
RC2-64-CBC
RC2-CBC
RC2-CFB
RC2-ECB
RC2-OFB
RC4
RC4-40
RC4-HMAC-MD5
RC5-CBC
RC5-CFB
RC5-ECB
RC5-OFB
seed => SEED-CBC
SEED-CBC
SEED-CFB
SEED-ECB
SEED-OFB
[root@centos85 ~]#
```

`openssl list -public-key-algorithms`を実行すると以下の通り。
```console:実行結果
[root@centos85 ~]# openssl list -public-key-algorithms
Name: OpenSSL RSA method
        Type: Builtin Algorithm
        OID: rsaEncryption
        PEM string: RSA
Name: rsa
        Alias for: rsaEncryption
Name: OpenSSL PKCS#3 DH method
        Type: Builtin Algorithm
        OID: dhKeyAgreement
        PEM string: DH
Name: dsaWithSHA
        Alias for: dsaEncryption
Name: dsaEncryption-old
        Alias for: dsaEncryption
Name: dsaWithSHA1-old
        Alias for: dsaEncryption
Name: dsaWithSHA1
        Alias for: dsaEncryption
Name: OpenSSL DSA method
        Type: Builtin Algorithm
        OID: dsaEncryption
        PEM string: DSA
Name: OpenSSL EC algorithm
        Type: Builtin Algorithm
        OID: id-ecPublicKey
        PEM string: EC
Name: OpenSSL HMAC method
        Type: Builtin Algorithm
        OID: hmac
        PEM string: HMAC
Name: OpenSSL CMAC method
        Type: Builtin Algorithm
        OID: cmac
        PEM string: CMAC
Name: OpenSSL RSA-PSS method
        Type: Builtin Algorithm
        OID: rsassaPss
        PEM string: RSA-PSS
Name: OpenSSL X9.42 DH method
        Type: Builtin Algorithm
        OID: X9.42 DH
        PEM string: X9.42 DH
Name: OpenSSL X25519 algorithm
        Type: Builtin Algorithm
        OID: X25519
        PEM string: X25519
Name: OpenSSL X448 algorithm
        Type: Builtin Algorithm
        OID: X448
        PEM string: X448
Name: OpenSSL POLY1305 method
        Type: Builtin Algorithm
        OID: poly1305
        PEM string: POLY1305
Name: OpenSSL SIPHASH method
        Type: Builtin Algorithm
        OID: siphash
        PEM string: SIPHASH
Name: OpenSSL ED25519 algorithm
        Type: Builtin Algorithm
        OID: ED25519
        PEM string: ED25519
Name: OpenSSL ED448 algorithm
        Type: Builtin Algorithm
        OID: ED448
        PEM string: ED448
[root@centos85 ~]#
```

`openssl list -public-key-methods`を実行すると以下の通り。
```console:実行結果
[root@centos85 ~]# openssl list -public-key-methods
rsaEncryption
        Type: External Algorithm
dhKeyAgreement
        Type: Builtin Algorithm
dsaEncryption
        Type: External Algorithm
id-ecPublicKey
        Type: Builtin Algorithm
hmac
        Type: Builtin Algorithm
cmac
        Type: Builtin Algorithm
rsassaPss
        Type: External Algorithm
X9.42 DH
        Type: Builtin Algorithm
scrypt
        Type: Builtin Algorithm
tls1-prf
        Type: Builtin Algorithm
X25519
        Type: Builtin Algorithm
X448
        Type: Builtin Algorithm
hkdf
        Type: Builtin Algorithm
poly1305
        Type: Builtin Algorithm
siphash
        Type: Builtin Algorithm
ED25519
        Type: Builtin Algorithm
ED448
        Type: Builtin Algorithm
[root@centos85 ~]#
```

今回は、共通鍵暗号方式では`openssl enc`コマンドを、公開鍵暗号方式では`openssl rsautl`を使うので、そのリストとヘルプも見ておきます。

```console:「openssl enc -help」の実行結果
[root@centos85 ~]# openssl enc -help
Usage: enc [options]
Valid options are:
 -help               Display this summary
 -list               List ciphers
 -ciphers            Alias for -list
 -in infile          Input file
 -out outfile        Output file
 -pass val           Passphrase source
 -e                  Encrypt
 -d                  Decrypt
 -p                  Print the iv/key
 -P                  Print the iv/key and exit
 -v                  Verbose output
 -nopad              Disable standard block padding
 -salt               Use salt in the KDF (default)
 -nosalt             Do not use salt in the KDF
 -debug              Print debug info
 -a                  Base64 encode/decode, depending on encryption flag
 -base64             Same as option -a
 -A                  Used with -[base64|a] to specify base64 buffer as a single line
 -bufsize val        Buffer size
 -k val              Passphrase
 -kfile infile       Read passphrase from file
 -K val              Raw key, in hex
 -S val              Salt, in hex
 -iv val             IV in hex
 -md val             Use specified digest to create a key from the passphrase
 -iter +int          Specify the iteration count and force use of PBKDF2
 -pbkdf2             Use password-based key derivation function 2
 -none               Don't encrypt
 -*                  Any supported cipher
 -rand val           Load the file(s) into the random number generator
 -writerand outfile  Write random data to the specified file
 -z                  Use zlib as the 'encryption'
 -engine val         Use engine, possibly a hardware device
[root@centos85 ~]#
```

```console:「openssl enc -list」の実行結果
[root@centos85 ~]# openssl enc -list
Supported ciphers:
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb
-aes-128-ofb               -aes-192-cbc               -aes-192-cfb
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr
-aes-192-ecb               -aes-192-ofb               -aes-256-cbc
-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8
-aes-256-ctr               -aes-256-ecb               -aes-256-ofb
-aes128                    -aes128-wrap               -aes192
-aes192-wrap               -aes256                    -aes256-wrap
-aria-128-cbc              -aria-128-cfb              -aria-128-cfb1
-aria-128-cfb8             -aria-128-ctr              -aria-128-ecb
-aria-128-ofb              -aria-192-cbc              -aria-192-cfb
-aria-192-cfb1             -aria-192-cfb8             -aria-192-ctr
-aria-192-ecb              -aria-192-ofb              -aria-256-cbc
-aria-256-cfb              -aria-256-cfb1             -aria-256-cfb8
-aria-256-ctr              -aria-256-ecb              -aria-256-ofb
-aria128                   -aria192                   -aria256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1
-camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb
-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ctr
-camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc
-camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8
-camellia-256-ctr          -camellia-256-ecb          -camellia-256-ofb
-camellia128               -camellia192               -camellia256
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-chacha20                  -des                       -des-cbc
-des-cfb                   -des-cfb1                  -des-cfb8
-des-ecb                   -des-ede                   -des-ede-cbc
-des-ede-cfb               -des-ede-ecb               -des-ede-ofb
-des-ede3                  -des-ede3-cbc              -des-ede3-cfb
-des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ecb
-des-ede3-ofb              -des-ofb                   -des3
-des3-wrap                 -desx                      -desx-cbc
-id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-wrap
-id-aes192-wrap-pad        -id-aes256-wrap            -id-aes256-wrap-pad
-id-smime-alg-CMS3DESwrap  -idea                      -idea-cbc
-idea-cfb                  -idea-ecb                  -idea-ofb
-rc2                       -rc2-128                   -rc2-40
-rc2-40-cbc                -rc2-64                    -rc2-64-cbc
-rc2-cbc                   -rc2-cfb                   -rc2-ecb
-rc2-ofb                   -rc4                       -rc4-40
-rc5-cbc                   -rc5-cfb                   -rc5-ecb
-rc5-ofb                   -seed                      -seed-cbc
-seed-cfb                  -seed-ecb                  -seed-ofb

[root@centos85 ~]#
```

```console:「openssl rsautl -help」の実行結果
[root@centos85 ~]# openssl rsautl -help
Usage: rsautl [options]
Valid options are:
 -help                    Display this summary
 -in infile               Input file
 -out outfile             Output file
 -inkey val               Input key
 -keyform PEM|DER|ENGINE  Private key format - default PEM
 -pubin                   Input is an RSA public
 -certin                  Input is a cert carrying an RSA public key
 -ssl                     Use SSL v2 padding
 -raw                     Use no padding
 -pkcs                    Use PKCS#1 v1.5 padding (default)
 -oaep                    Use PKCS#1 OAEP
 -sign                    Sign with private key
 -verify                  Verify with public key
 -asn1parse               Run output through asn1parse; useful with -verify
 -hexdump                 Hex dump output
 -x931                    Use ANSI X9.31 padding
 -rev                     Reverse the order of the input buffer
 -encrypt                 Encrypt with public key
 -decrypt                 Decrypt with private key
 -passin val              Input file pass phrase source
 -rand val                Load the file(s) into the random number generator
 -writerand outfile       Write random data to the specified file
 -engine val              Use engine, possibly a hardware device
[root@centos85 ~]#
```

# 1. 共通鍵暗号方式による暗号化・複合化
ここでは、共通鍵暗号方式のアルゴリズムとして、AES-256-CBC（`-aes-256-cbc`）を使ってみます。

### 1.1. パスワードのみを指定して暗号化・複合化（共通鍵はOpenSSLで自動生成される）

暗号化するファイルとして、以下の`sample.txt`を用意します。
```text:sample.txt
Hello, how are you?
I'm doing fine.
```

パスワードとして、以下の`password.txt`を用意します。
```text:password.txt
password01
```


以下のコマンドで暗号化します。
`openssl enc -aes-256-cbc -salt -in sample.txt -out sample.enc -pass file:password.txt`

（ここではやっていませんが、`openssl enc`コマンドで`-base64`のおプションを付けると暗号化したファイルをBase64に変換して出力することもできます。）

```console:実行結果
[root@centos85 test]# openssl enc -aes-256-cbc -salt -in sample.txt -out sample.enc -pass file:password.txt
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
[root@centos85 test]# 
```

`sample.enc`を参照すると暗号化されています。
```console:実行結果
[root@centos85 test]# ls -l sample.enc
-rw-r--r--. 1 root root 64  7月 11 17:59 sample.enc
-rw-r--r--. 1 root root 64  7月 11 17:59 sample.enc
[root@centos85 test]# cat sample.enc
Salted__TｫｫHf^}QY\鳫ｶ?^ｫ・      |鰓zﾘﾘXﾖ7ﾊﾎﾇﾐ]/ｵh?[root@centos85 test]#
```

以下のコマンドで複合化します。
`openssl enc -aes-256-cbc -d -in sample.enc -out sample_dec.txt -pass file:password.txt`

```console:実行結果
[root@centos85 test]# openssl enc -aes-256-cbc -d -in sample.enc -out sample_dec.txt -pass file:password.txt
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
[root@centos85 test]#
```

`sample_dec.txt`を参照すると複合化されています。
```console:実行結果
[root@centos85 test]# ls -l sample_dec.txt
-rw-r--r--. 1 root root 36  7月 11 18:02 sample_dec.txt
[root@centos85 test]# cat sample_dec.txt
Hello, how are you?
I'm doing fine.
[root@centos85 test]#
```

### 1.2. 共通鍵を指定して暗号化・複合化
「1.1. パスワードのみを指定して暗号化・複合化」ではOpenSSLが自動的に共通鍵を設定していますが、今度はコマンドで共通鍵を設定してみます。

まず、以下のコマンドで、ランダムな鍵と初期化ベクトル（IV）を生成します。
`openssl rand -base64 32 > key.base64`
`openssl rand -base64 16 > iv.base64`

```console:実行結果
[root@centos85 test]# openssl rand -base64 32 > key.base64
[root@centos85 test]# openssl rand -base64 16 > iv.base64
[root@centos85 test]# ls -l key.base64
-rw-r--r--. 1 root root 45  7月 11 18:08 key.base64
[root@centos85 test]# cat key.base64
YouvrednwRqD8YlwQCFVUIqpMgJYKqVAf6udI53HeTY=
[root@centos85 test]# ls -l iv.base64
-rw-r--r--. 1 root root 25  7月 11 18:08 iv.base64
[root@centos85 test]# cat iv.base64
bbe/2q762efS9ITOqgWmzg==
[root@centos85 test]#
```

以下のコマンドで暗号化します。
`openssl enc -aes-256-cbc -in sample.txt -out sample2.enc -K $(cat key.base64 | base64 -d | xxd -p -c 32 | tr -d '\n') -iv $(cat iv.base64 | base64 -d | xxd -p -c 16 | tr -d '\n')`

```console:実行結果
[root@centos85 test]# openssl enc -aes-256-cbc -in sample.txt -out sample2.enc -K $(cat key.base64 | base64 -d | xxd -p -c 32 | tr -d '\n') -iv $(cat iv.base64 | base64 -d | xxd -p -c 16 | tr -d '\n')
[root@centos85 test]#
```

`sample2.enc`を参照すると暗号化されています。
```console:実行結果
[root@centos85 test]# ls -l sample2.enc
-rw-r--r--. 1 root root 48  7月 11 22:19 sample2.enc
[root@centos85 test]# cat sample2.enc
w!?dI｢
 ｬB+~ﾖTﾘE(iQI・dｱｧ・
                    {胙ﾍ罕[root@centos85 test]#
```

以下のコマンドで複合化します。
`openssl enc -aes-256-cbc -d -in sample2.enc -out sample2_dec.txt -K $(cat key.base64 | base64 -d | xxd -p -c 32 | tr -d '\n') -iv $(cat iv.base64 | base64 -d | xxd -p -c 16 | tr -d '\n')`

```console:実行結果
[root@centos85 test]# openssl enc -aes-256-cbc -d -in sample2.enc -out sample2_dec.txt -K $(cat key.base64 | base64 -d | xxd -p -c 32 | tr -d '\n') -iv $(cat iv.base64 | base64 -d | xxd -p -c 16 | tr -d '\n')
[root@centos85 test]#
```

`sample2_dec.txt`を参照すると複合化されています。
```console:実行結果
[root@centos85 test]# ls -l sample2_dec.txt
-rw-r--r--. 1 root root 36  7月 11 23:58 sample2_dec.txt
[root@centos85 test]# cat sample2_dec.txt
Hello, how are you?
I'm doing fine.
[root@centos85 test]#
```


# 2. 公開鍵暗号方式による暗号化・複合化
以下のコマンドで秘密鍵を作成します。
`openssl genrsa -out private-key.pem -aes-256-cbc -passout file:password.txt`

```console:実行結果
[root@centos85 test]# openssl genrsa -out private-key.pem -aes-256-cbc -passout file:password.txt
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................+++++
..............+++++
e is 65537 (0x010001)
[root@centos85 test]# ls -l private-key.pem
-rw-------. 1 root root 1766  7月 12 00:27 private-key.pem
[root@centos85 test]#
```

以下のコマンドで公開鍵を作成します。
`openssl rsa -in private-key.pem -pubout -out public-key.pem -passin file:password.txt`

```console:実行結果
[root@centos85 test]# openssl rsa -in private-key.pem -pubout -out public-key.pem -passin file:password.txt
writing RSA key
[root@centos85 test]# ls -l public-key.pem
-rw-r--r--. 1 root root 451  7月 12 01:44 public-key.pem
[root@centos85 test]#
```

以下のコマンドで公開鍵を使って暗号化します。
`openssl rsautl -encrypt -pubin -inkey public-key.pem -in sample.txt -out sample3.enc`

```console:実行結果
[root@centos85 test]# openssl rsautl -encrypt -pubin -inkey public-key.pem -in sample.txt -out sample3.enc
[root@centos85 test]#
```

sample3.encを参照すると暗号化されています。
```console:実行結果
[root@centos85 test]# openssl rsautl -encrypt -pubin -inkey public-key.pem -in sample.txt -out sample3.enc
[root@centos85 test]# ls -l sample3.enc
-rw-r--r--. 1 root root 256  7月 12 01:46 sample3.enc
[root@centos85 test]# cat sample3.enc
S:qB&~ﾕ鈩w+｡3'&?(・iｴ,i暿ｮyﾏﾁｬ5Vec!(C}wH?S`P ｣ﾄ   ﾅiｮ9?^Bｳ[       莵H莉%ｮ R拌ﾇ/ﾋ4`?鞏L膩ﾂ?ｾ,ｧeｧ･ﾀ=玽bM?.鋕        ﾉ焄oﾒWｺ|?Q=ﾓDｿ
                                                                ﾍﾋt・Hﾜb乕ｽ?  ?ｿoｫﾒ.ﾜAｷ?,ﾉﾖﾘY.zﾏﾂwl艟ｺ・･P?ﾉ[root@centos85 test]#
```

以下のコマンドで秘密鍵を使って複合化します。
`openssl rsautl -decrypt -inkey private-key.pem -in  sample3.enc -out sample3_dec.txt -passin file:password.txt`

```console:実行結果
[root@centos85 test]# openssl rsautl -decrypt -inkey private-key.pem -in  sample3.enc -out sample3_dec.txt -passin file:password.txt
[root@centos85 test]#
```

`sample3_dec.txt`を参照すると複合化されています。
```console:実行結果
[root@centos85 test]# cat sample3_dec.txt
Hello, how are you?
I'm doing fine.
[root@centos85 test]#
```

# 3. ハッシュ値の取得

ここでは`sh256`でハッシュ値を取得しています。

以下のコマンドでハッシュ値を取得します。
`openssl dgst -sha256 sample.txt`

```console:実行結果
[root@centos85 test]# openssl dgst -sha256 sample.txt
SHA256(sample.txt)= 4e6cbcf89bf9bf55f48dc889472a6cd26fa6374271009d4aa0701c6e0c4c9b93
[root@centos85 test]#
```
出力結果の通り、ファイル、ハッシュ値の順で出力されます。

出力順序を変えたい場合は、`-r`オプションを付けます。
`openssl dgst -sha256 -r sample.txt`

```console:実行結果
[root@centos85 test]# openssl dgst -sha256 -r sample.txt
4e6cbcf89bf9bf55f48dc889472a6cd26fa6374271009d4aa0701c6e0c4c9b93 *sample.txt
[root@centos85 test]#
```

ハッシュ値のみ出力したい場合は、以下のコマンドを実行します。
`openssl dgst -sha256 sample.txt | awk '{print $2}'`

```console:実行結果
[root@centos85 test]# openssl dgst -sha256 sample.txt | awk '{print $2}'
4e6cbcf89bf9bf55f48dc889472a6cd26fa6374271009d4aa0701c6e0c4c9b93
[root@centos85 test]#
```

---

以上