Я не уверен, что это подходящее место, чтобы спросить об этом. Но у меня нет опыта работы с C #, и мне было поручено преобразовать код безопасности в Golang.
Мне было интересно, не упускаю ли я что-то здесь.
Код C # использует класс Rijndael
для шифрования небольшого количества данных. Значение key
и значение iv
записывается в байтовом коде следующим образом
public static byte[] Key = new byte[]{0xx, 0xx, 0xx, 0xx, 0xx,
0xx4, 0xxx, 0xxx, 0xxx, 0xxx, xxx, 0xxx,
0xxx, 0xxx, 0xxx, 0xxx};
public static byte[] IV = new byte[] // save structure as above with 16 in length
тогда есть немного кода, который делает это
Rijndael alg = Rijndael.Create();
alg.Key = Key;
alg.IV = IV;
CryptoStream cs = new CryptoStream(ms,
alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(dataWithoutHeader, 0, dataWithoutHeader.Length);
cs.Close();
функция отправляет byte[] data
в качестве вывода
Я пытаюсь имитировать это golang
вот так
func StartEncryption(message []byte) []byte {
var key = []byte {// same as C# }
var iv = []byte{ // same as C# }
var err error
fmt.Printf("\n length of key %+v \n, \n length of iv \n %+v \n", len(key), len(iv))
// Encrypt
encrypted := make([]byte, len(message))
err = EncryptAESCFB(encrypted, []byte(message), key, iv)
if err != nil {
panic(err)
}
return encrypted
}
Функция шифрования
func EncryptAESCFB(dst, src, key, iv []byte) error {
aesBlockEncrypter, err := aes.NewCipher([]byte(key))
if err != nil {
return err
}
aesEncrypter := cipher.NewCFBEncrypter(aesBlockEncrypter, iv)
aesEncrypter.XORKeyStream(dst, src)
return nil
}
Выходные данные отправляются через API, выходные данные которого необходимо расшифровать. Я использую это ниже
func decryptMessage(message []byte)error{
var key = []byte{ // same as C# }
var iv = []byte{ // same as C# }
// Remove the head part of the response (45 bytes)
responseBody := message[45:]
decrypted := make([]byte, len(responseBody))
err := DecryptAESCFB(decrypted, responseBody, key, iv)
if err != nil {
fmt.Printf("\n error : \n %+v \n", err)
}
return nil
}
func DecryptAESCFB(dst, src, key, iv []byte) error {
aesBlockDecrypter, err := aes.NewCipher([]byte(key))
if err != nil {
return nil
}
aesDecrypter := cipher.NewCFBDecrypter(aesBlockDecrypter, iv)
aesDecrypter.XORKeyStream(dst, src)
return nil
}
Расшифровщик дает мне тарабарщину - я где-то ошибаюсь?
Мой вопрос сводится к 2 вопросам
Будет ли функция C #, использующая класс
rijndael
и функция golang, давать тот же результат, или я должен делать что-то большее / меньшееЯвляется ли байтовый массив правильными данными для хранения ключа, IV в - т.е. это не то же самое, что используется в C # при копировании в GO