一般社団法人 全国個人事業主支援協会

COLUMN コラム

こんにちは。
私はフリーランスでソフトウェアエンジニアとして、バックエンドやインフラ面からアプリ構築を支援したりしています。

今回はEncode, Encryptoについてざっくりと書きます。
encode と decode、および encrypt と decrypt は、データ処理の文脈でよく使われる概念ですが、それぞれ異なる意味と目的を持っています。
以下で詳しく解説します。

Encode と Decode
○Encode(エンコード)
目的: データを特定の形式やプロトコルに変換すること。

用途:
データを他のシステムやプログラムで理解できる形式に変換する。
ネットワーク通信やファイル保存のためにデータ形式を変換する。

例:
文字列エンコード:テキストを UTF-8、ASCII などの文字コード形式に変換。
データ形式エンコード:JSON、XML、Base64 形式への変換。
Gob(Goでのバイナリエンコード):Goのデータ型をバイナリ形式に変換。

○Decode(デコード)
目的: エンコードされたデータを元の形式に戻すこと。

用途:
エンコードされたデータを解釈して、元の情報を取得する。
例:
Base64でエンコードされた文字列を元のデータに戻す。
JSON形式のデータをデシリアライズして構造体やオブジェクトに変換。

Encrypt と Decrypt
○Encrypt(暗号化)
目的: データを保護するために、アクセス可能な形式から保護された形式に変換すること。
用途:
データの秘匿性を保つ(第三者が内容を理解できないようにする)。
機密情報のセキュリティを確保。
例:
対称暗号(同じ鍵で暗号化と復号化を行う):AES、DESなど。
非対称暗号(公開鍵で暗号化、秘密鍵で復号化):RSA、ECDSAなど。

○Decrypt(復号化)
目的: 暗号化されたデータを元の可読な形式に戻すこと。
用途:
許可されたユーザーが暗号化されたデータを閲覧できるようにする。
例:
暗号化されたメッセージを秘密鍵で復号して、元のメッセージを取得。

○Encode/Decode と Encrypt/Decrypt の違い
特徴 Encode/Decode Encrypt/Decrypt
目的 データ形式の変換 データの秘匿化と保護
可読性 エンコードされたデータは通常可読 暗号化されたデータは通常不可読
戻し方 誰でもデコード可能(仕様を知っていれば可能) 許可された人のみ復号可能(鍵や資格が必要)
主な用途 通信、ストレージ、フォーマットの互換性など セキュリティ、プライバシー保護、アクセス制限
技術の例 Base64、JSON、Gobなど AES、RSA、TLSなど
実際の利用例
Encode/Decode の利用例
Base64 エンコード: バイナリデータを文字列形式に変換。

“`
func main() {
data := “Hello, World!”
encoded := base64.StdEncoding.EncodeToString([]byte(data))
fmt.Println(“Encoded:”, encoded)

decoded, _ := base64.StdEncoding.DecodeString(encoded)
fmt.Println(“Decoded:”, string(decoded))
}
“`

Encrypt/Decrypt の利用例(AES)
AES 暗号化と復号:対称暗号を使ったデータ保護。
“`
func main() {
key := []byte(“examplekey123456”) // 16 bytes key for AES-128
plainText := []byte(“Sensitive Data”)

encrypted, _ := encrypt(plainText, key)
fmt.Printf(“Encrypted: %x\n”, encrypted)

decrypted, _ := decrypt(encrypted, key)
fmt.Printf(“Decrypted: %s\n”, decrypted)
}

func encrypt(plainText []byte, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

cipherText := make([]byte, aes.BlockSize+len(plainText))
iv := cipherText[:aes.BlockSize]

if _, err := io.ReadFull(rand.Reader, iv); err != nil {
return nil, err
}

stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(cipherText[aes.BlockSize:], plainText)

return cipherText, nil
}

func decrypt(cipherText []byte, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

iv := cipherText[:aes.BlockSize]
cipherText = cipherText[aes.BlockSize:]

stream := cipher.NewCFBDecrypter(block, iv)
plainText := make([]byte, len(cipherText))
stream.XORKeyStream(plainText, cipherText)

return plainText, nil
}

“`

○まとめ
Encode/Decode: データ形式や互換性を重視した変換。
Encrypt/Decrypt: セキュリティとデータ保護を目的とした変換。

The following two tabs change content below.

中川 豪

最新記事 by 中川 豪 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア