#go #cryptography #rsa #endianness #public-key-encryption
#Вперед #криптография #rsa #порядковый номер #шифрование с открытым ключом
Вопрос:
У меня есть требование, при котором у меня есть массив байтов в формате с небольшим конечным значением в качестве входных данных. Мне нужно извлечь из него экспоненту и модуль, создать открытый ключ и использовать его для шифрования данных. Поэтому я поместил следующий фрагмент кода:
exponentLen := 4
exponentArr := key[:exponentLen] - ///Where key is the input byte array
modulusStrOffset := exponentLen
n := big.Int{}
n.SetBytes(key[modulusStrOffset:])
eb := big.Int{}
eb.SetBytes(exponentArr)
ex, err := strconv.Atoi(eb.String())
if err != nil {
return nil, errors.Wrap(err, "GetRsaPubKey: Strconv to int")
}
pubKey := rsa.PublicKey{N: amp;n, E: int(ex)}
cipherText, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, pubKey, swk, nil) /// swk is the data to be encrypted
Этот код успешно шифрует данные без каких-либо ошибок.
Однако это не удается на стороне дешифрования.
Это так, потому что SetBytes() предполагает, что входной массив байтов находится в формате большого конечного (однако наш массив байтов находится в файле). Таким образом, вычисленные модуль и показатель неверны.
Есть ли способ изменить порядок байтов входного массива из файла на BE, а затем создать экспоненты и модуль в формате Little Endian, а затем создать открытый ключ и использовать его для шифрования.. Пожалуйста, обратите внимание, что я пытался использовать:
var n1 big.Int
n1.SetBits(n.Bits())
но проблема сохраняется.