Режим OpenPGP CFB для Tag18

нижняя часть страницы 50 в RFC 4880 описывает, как зашифровать незашифрованные данные для хранения в пакете данных с симметричным шифрованием и защитой целостности (тег 18). Это говорит о том, что Режим CFB используется. Я написал код для CFB, чтобы он работал, как описано в разделе 13.9 (для пакетов с симметричным шифрованием (тег 9)). Однако на странице 50 также говорится:

В отличие от пакета данных с симметричным шифрованием, нет специального CFB
ресинхронизация выполняется после шифрования данных этого префикса.

Таким образом, для тега 18 шаги должны выглядеть следующим образом:

Шаг за шагом, вот процедура:

  1. Регистр обратной связи (FR) установлен на IV, который является всеми нулями.

  2. FR зашифрован, чтобы произвести FRE (FR Encrypted). Это
    шифрование нулевого значения.

  3. FRE записывается с первыми октетами BS случайных данных с префиксом
    открытый текст для производства C1 через C [BS], первые октеты BS
    зашифрованного текста.

  4. FR загружается с C [1] через C [BS].

  5. FR зашифрован, чтобы произвести FRE, шифрование первой BS
    октеты зашифрованного текста.

  6. Два оставшихся октета FRE записываются с помощью следующих двух октетов
    данные, которые были добавлены к открытому тексту. Это производит C [BS + 1] и C [BS + 2], следующие два октета зашифрованного текста.

  7. (̶T̶h̶e̶ ̶r̶e̶s̶y̶n̶c̶h̶r̶o̶n̶i̶z̶a̶t̶i̶o̶n̶ ̶s̶t̶e̶p̶) ̶ ̶F̶R̶ ̶i̶s̶ ̶l̶o̶a̶d̶e̶d̶ ̶w̶i̶t̶h̶̶ ̶̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶ ̶
    С [Bs + 2].

  8. FR зашифрован для производства̶ FRE

  9. FRE обозначается первыми октетами BS данного открытого текста, теперь
    что мы закончили шифрование BS + 2 октета с префиксом
    данные. Это производит C [BS + 3] через C [BS + (BS + 2)], следующую BS
    октеты зашифрованного текста.

  10. FR загружается с C [BS + 3] до C [BS + (BS + 2)] (который является C11-C18 для
    8-октетный блок).

    1. FR зашифрован, чтобы произвести FRE.

    2. FRE сопровождается следующими октетами BS открытого текста, чтобы произвести
      следующие октеты BS зашифрованного текста. Они загружаются в FR, и
      процесс повторяется до тех пор, пока не будет использован текст.

Поскольку шаг ресинхронизации не выполнен, на шаге 8 используется FRE шага 5, поэтому его можно игнорировать, верно?

Из вышеперечисленных шагов, что я неправильно истолковал в следующем коде? Я знаю, что это работает для Tag 9, с шагом ресинхронизации, но что-то не складывается для Tag 18.

std::string CFB_encrypt(SymAlg * crypt, uint8_t packet, std::string data, std::string prefix){
uint8_t BS = crypt -> blocksize() >> 3;
// 1
std::string IV(BS, 0);
// 2
std::string FR = IV;
std::string FRE = crypt -> encrypt(FR);
// 3
FRE = xor_strings(FRE, prefix);
std::string C = FRE;
// 4
FR = C;
// 5
FRE = crypt -> encrypt(FR);
// 6
C += xor_strings(FRE.substr(0, 2), prefix.substr(BS - 2, 2));
// 7
if (packet == 9){
FR = C.substr(2, BS);
}
// 8
FRE = crypt -> encrypt(FR);
// 9
C += xor_strings(FRE, data.substr(0, BS));
unsigned int x = BS;
while (x < data.size()){
// 10
FR = C.substr(x + 2, BS);
// 11
FRE = crypt -> encrypt(FR);
// 12
C += xor_strings(FRE, data.substr(x, BS));
x += BS;
}
return C;
}

Что я упустил?

0

Решение

Ваш шаг 3 здесь:

3. FRE is xored with the first BS octets of random data prefixed to the plaintext

не совпадает с вашим кодом:

// 3
std::string C = FRE;

Здесь не происходит ксоринга. Попробуйте изменить это на:

std::string C = xor_strings(FRE, prefix.substr(0,8));
1

Другие решения

Этот кусок кода как-то работает. Я не понимаю

    else {
plaintext = "  "+plaintext;
// 9.  FRE is xored with the first 8 octets of the given plaintext, now
//     that we have finished encrypting the 10 octets of prefixed data.
//     This produces C11-C18, the next 8 octets of ciphertext.
for (var i = 2; i &lt; block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(i));
var tempCiphertext = ciphertext.substring(0,2*block_size).split('');
var tempCiphertextString = ciphertext.substring(block_size);
for(n=block_size; n&lt;plaintext.length; n+=block_size) {
// 10. FR is loaded with C11-C18
for (var i = 0; i &lt; block_size; i++) FR[i] = tempCiphertextString.charCodeAt(i);
tempCiphertextString='';

// 11. FR is encrypted to produce FRE.
FRE = blockcipherencryptfn(FR, key);

// 12. FRE is xored with the next 8 octets of plaintext, to produce the
//     next 8 octets of ciphertext.  These are loaded into FR and the
//     process is repeated until the plaintext is used up.
for (var i = 0; i &lt; block_size; i++){ tempCiphertext.push(String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(n+i)));
tempCiphertextString += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(n+i));
}
}
ciphertext = tempCiphertext.join('');

}
return ciphertext;
}
0

По вопросам рекламы [email protected]