Я не уверен, что это правильное место, чтобы спросить это.Но у меня нет опыта работы с 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 in - то есть он не тот, который используется в C # при копировании в GO