Closed4

VoTTの暗号化データをGoで復号化したい

nabeyangnabeyang

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]
}
nabeyangnabeyang

crypto-jsのAESはCBCモードでパディングはPkcs7
ずっと悩んでたivとブロックサイズが合わない件だけど、コード見たらコードブロック分しか使ってないから途中で切って良い。
https://github.com/brix/crypto-js/blob/release-3.1.2-1/src/cipher-core.js

//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];
            }
        }
このスクラップは2021/03/31にクローズされました