共通鍵暗号の1つであるS-DES(Simplified DES)をGoで実装してみたその1~key generate編~

共通鍵暗号の1つであるS-DES(Simplified DES)をGoで実装してみたその1~key generate編~

前回は公開鍵暗号の1つであるRSA暗号を実装してみたが、今回は共通鍵暗号の1つであるS-DESを実装していく。

公開鍵暗号の1つを実装してみたのであれば、共通鍵暗号の1つも実装しないわけには行かないだろう

公開鍵暗号の1つであるRSA暗号をGolangで実装してみる
注意: ところどころ簡素化してあるところはあります
GitHub - kooooohe/SimplifiedDES-Go
Contribute to kooooohe/SimplifiedDES-Go development by creating an account on GitHub.

↑のGitHubに随時追加していく予定です

DESとは

DESとは、1977年にアメリカ連邦政府標準の暗号方式として採用された、共通鍵(秘密鍵)暗号方式の一つ。 DESは旧米国立標準局(NBS、現NIST)の標準規格としての名称であるため、暗号方式(暗号アルゴリズム)そのものを指す場合は「DEA」(Data Encryption Algorithm)と呼ばれることもある。
DES - CTF Wiki
CTF Wiki

3DES

また、コンピュータの進化に伴ってより強度な暗号を生み出す必要があり、このDESの改良版である3DESもある。

※DESを三回繰り返すことにより、暗号強度を高めている。また、DESとの互換性もある

また、この互換性を持つための仕組みも知ると、思ったより簡単で面白いだろう

しかし、2023年を目処に使用は禁止される予定である。

S-DES

S-DES(Simplified DES)は教育用に作られたDES、鍵の長さや短かったり、暗号化が8bitずつであったり、ラウンド数などがDESより短くなっているが仕組みは同じである。

※あくまで教育用で作られており暗号強度は強くないのでProductionでは使わないように

そして今回は、このS-DESを実装を通して勉強していこうと思う、

本記事ではsub keyを作るところまでをおこなう

10bitのsecret keyを用いて8bitのsub keyを2つ作るところまで

  • 10bitのsecret keyを準備 (DESでは64bit)
  • そこから2ラウンドで暗号化を行うので、subkeyを2つ準備(DESでは16個)
  • 鍵をp10を用いて転置をおこなう
  • 5bitごとにleft shiftする(DESでは1回と2回、left shiftするタイミングが決まっている)
  • p8を用いてsubkey1を出力(8bit)
  • 鍵を5bitごとleft shiftを2回する
  • p8を用いてsubkey2を出力
blog_des_1.go
GitHub Gist: instantly share code, notes, and snippets.
package main

import "fmt"

var k1 [8]int
var k2 [8]int

func main() {
	key := [10]int{1, 0, 0, 1, 0, 1, 0, 1, 0, 1}

	rKey := p10(key)
	rKey = leftShift(rKey)
	p8(rKey, 1)
	fmt.Println(k1)

	rKey = leftShift(rKey)
	rKey = leftShift(rKey)

	p8(rKey, 2)
	fmt.Println(k2)
}

func p10(oKey [10]int) (r [10]int) {
	p10 := [10]int{2, 4, 1, 6, 3, 9, 0, 8, 7, 5}
	for k, v := range p10 {
		r[k] = oKey[v]
	}
	return
}

func leftShift(key [10]int) [10]int {
	tmp := key[0]
	for i := 0; i < 4; i++ {
		key[i] = key[i+1]
	}
	key[4] = tmp
	tmp = key[5]

	for i := 5; i < 9; i++ {
		key[i] = key[i+1]
	}
	key[9] = tmp
	return key
}

func p8(key [10]int, k int) {
	p8 := [8]int{5, 2, 6, 3, 7, 4, 9, 8}
	if k == 1 {
		for k, v := range p8 {
			k1[k] = key[v]
		}
	} else {
		for k, v := range p8 {
			k2[k] = key[v]
		}
	}
}

これにてS-DESにおける暗号化に必要な2つのsubkeyの出力が終わった。

次回以降このkeysを使って、暗号化を実装していこうと思います。

参考:

::CryptoGraphy - University of Rhode Island ::
simplified-des-example.pdf

おすすめ本

暗号技術のすべて | IPUSIRON |本 | 通販 | Amazon
AmazonでIPUSIRONの暗号技術のすべて。アマゾンならポイント還元本が多数。IPUSIRON作品ほか、お急ぎ便対象商品は当日お届けも可能。また暗号技術のすべてもアマゾン配送商品なら通常配送無料。