1
我想在Go中讀取VIM編碼的文件。 This code適用於小文件,因此我決定將它轉換爲Go。密鑰生成工作正常,但Blowfish編碼不會。我將問題追溯到BF_encrypt和cipher.Encrypt(...)的不同結果。OpenSSL和Golang之間的河豚結果不同
輸入
key: c904a7a85bbd975324c5083ed96ff022f25e062da1d575b2462c2c98d8d64d9d
data: 538b7759834d3418
輸出
Golang: b5cf33144acbc794
C: 90baa70ec3e44867
Golang代碼:
package main
import (
"fmt"
"golang.org/x/crypto/blowfish"
)
func main() {
key := []byte{0xc9, 0x04, 0xa7, 0xa8, 0x5b, 0xbd, 0x97, 0x53, 0x24, 0xc5, 0x08, 0x3e, 0xd9, 0x6f, 0xf0, 0x22, 0xf2, 0x5e, 0x06, 0x2d, 0xa1, 0xd5, 0x75, 0xb2, 0x46, 0x2c, 0x2c, 0x98, 0xd8, 0xd6, 0x4d, 0x9d}
data := []byte{0x53, 0x8b, 0x77, 0x59, 0x83, 0x4d, 0x34, 0x18}
cipher, err := blowfish.NewCipher(key)
if err != nil {
panic(err)
}
fmt.Printf("key: %x\n", key)
fmt.Printf("data: %x\n", data)
encrypted := make([]byte, 8)
cipher.Encrypt(encrypted, data)
fmt.Printf("encrypted: %x\n", encrypted)
}
的C代碼:
#include <stdio.h>
#include <string.h>
#include <openssl/blowfish.h>
#include <openssl/sha.h>
/*
clang test1.c -o test1 \
-I/usr/local/Cellar/openssl/1.0.2k/include \
-L/usr/local/Cellar/openssl/1.0.2k/lib \
-lcrypto
./test1
*/
int main(int argc, char *argv[]) {
unsigned char key[32] = {0xc9, 0x04, 0xa7, 0xa8, 0x5b, 0xbd, 0x97, 0x53, 0x24, 0xc5, 0x08, 0x3e, 0xd9, 0x6f, 0xf0, 0x22, 0xf2, 0x5e, 0x06, 0x2d, 0xa1, 0xd5, 0x75, 0xb2, 0x46, 0x2c, 0x2c, 0x98, 0xd8, 0xd6, 0x4d, 0x9d};
unsigned char data[8] = {0x53, 0x8b, 0x77, 0x59, 0x83, 0x4d, 0x34, 0x18};
BF_KEY bf_key;
BF_set_key(&bf_key, 32, key);
printf("key: ");
for (int j = 0; j < 32; j++) printf("%02x", key[j]);
printf("\n");
printf("data: ");
for (int j = 0; j < 8; j++) printf("%02x", data[j]);
printf("\n");
BF_encrypt((unsigned int*)data, &bf_key);
printf("encrypted: ");
for (int j = 0; j < 8; j++) printf("%02x", data[j]);
printf("\n");
return 0;
}
你能看到問題在哪裏嗎?
有趣。試試PHP來打破僵局:)。我使用了一個C++的河豚源(Jim Conger's),它在輸出中使用了不同於其他字節的字節順序,但這不是問題。 –
您應該找到一些[Blowfish測試媒介](https://www.google.com/search?q=blowfish+test+vectors)並查看哪個(如果有的話)到達正確的結果。 – jww
根據['BF_encrypt'手冊頁](https://linux.die.net/man/3/bf_encrypt):*「BF_encrypt()和BF_decrypt()是Blowfish加密的最低級別函數,它們加密/使用密鑰對數據指向的前64位數據進行解密,除非你實現Blowfish的'modes',否則不應該使用這些函數,或者使用BF_ecb_encrypt(),如果你仍然想使用這些函數,你應該知道它們以主機字節順序取得每個32位塊,這在小端平臺上是小端的,在大端端是大端的。「*。 – jww