Closed4
VoTTの暗号化データをGoで復号化したい
GoでVoTTで暗号化されている部分、特にエクスポートオプションの部分を複合化させたい。
VoTTの暗号化、復号化の処理はbrix/crypto-js
に依存している。
crypto-js
の方の結果はだいたいWordArrayのインスタンスになっていてword単位で書き出される。しかもuint32ではなく、int32。Goと比べるためにこんな関数を使ってる。
func bigEndianInt32(b []byte) int32 {
return int32(b[3]) | int32(b[2])<<8 | int32(b[1])<<16 | int32(b[0])<<24
}
func toInt32Array(b []byte) []int32 {
n := len(b) / 4
a := make([]int32, 0, n)
for i := 0; i < n; i++ {
a = append(a, bigEndianInt32(b[(i*4):((i+1)*4)]))
}
return a
}
func main() {
b := []byte{1, 2, 3, 4, 5, 6, 7, 8}
fmt.Println(toInt32Array(b))//=> [16909060 84281096]
}
crypto-js
のAESはCBC
モードでパディングはPkcs7
。
ずっと悩んでたiv
とブロックサイズが合わない件だけど、コード見たらコードブロック分しか使ってないから途中で切って良い。
//337行目から抜粋
function xorBlock(words, offset, blockSize) {
var block;
// Shortcut
var iv = this._iv;
// Choose mixing block
if (iv) {
block = iv;
// Remove IV for subsequent blocks
this._iv = undefined;
} else {
block = this._prevBlock;
}
// XOR blocks
for (var i = 0; i < blockSize; i++) {
words[offset + i] ^= block[i];
}
}
Go言語でCBCモードの暗号化、復号化はこのリンク先のようにすればOK
このスクラップは2021/03/31にクローズされました