Как мне расшифровать ключ AES, используя C# Bouncy Castle, который был зашифрован с помощью флага libgcrypt raw
Описание: Я пытаюсь расшифровать (и, в конечном итоге, зашифровать и вернуть) файлы, зашифрованные AES128. Ключ AES шифруется с использованием RSA-провайдера libcrypt. Когда я пытаюсь расшифровать AESKey в Windows 7 с помощью C# & BouncyCastle, при вызове "ProcessBlock" выдается ошибка "усеченный блок". Я попытался преобразовать данные в BigEndian, и я получу "Недопустимый показатель RSA", когда я попытаюсь создать RsaKeyParameters.
Шифрование было выполнено с использованием libgcrypt 1.2x в системе linux. Я думаю, что это проблема заполнения, так как этот фрагмент кода указывает, что заполнение не используется.gcry_sexp_build(&PlainKeyExp, NULL, "(data (flags raw) (value %s))", AESKey );
К сожалению, я не могу изменить исходную систему. Я включаю примеры кода и ключи ниже, чтобы помочь. Это сводит меня с ума в течение последних 3 дней. Я прочесал интернет и не нашел решения. Спасибо заранее за вашу помощь.
Фрагмент исходного кода
static const char RSAPrivateKey[] =
"(private-key"
" (rsa"
" (n #00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
" 2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
" ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
" 891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)"
" (e #010001#)"
" (d #046129f2489d71579be0a75fe029bd6cdb574ebf57ea8a5b0fda942cab943b11"
" 7d7bb95e5d28875e0f9fc5fcc06a72f6d502464dabded78ef6b716177b83d5bd"
" c543dc5d3fed932e59f5897e92e6f58a0f33424106a3b6fa2cbf877510e4ac21"
" c3ee47851e97d12996222ac3566d4ccb0b83d164074abf7de655fc2446da1781#)"
" (p #00e861b700e17e8afe6837e7512e35b6ca11d0ae47d8b85161c67baf64377213"
" fe52d772f2035b3ca830af41d8a4120e1c1c70d12cc22f00d28d31dd48a8d424f1#)"
" (q #00f7a7ca5367c661f8e62df34f0d05c10c88e5492348dd7bddc942c9a8f369f9"
" 35a07785d2db805215ed786e4285df1658eed3ce84f469b81b50d358407b4ad361#)"
" (u #304559a9ead56d2309d203811a641bb1a09626bc8eb36fffa23c968ec5bd891e"
" ebbafc73ae666e01ba7c8990bae06cc2bbe10b75e69fcacb353a6473079d8e9b#)))";
Error = gcry_sexp_sscan(&PublicKey, NULL, RSAPublicKey, strlen(RSAPublicKey));
if ( Error ) { goto Return; }
Error = gcry_sexp_sscan(&PrivateKey, NULL, RSAPrivateKey, strlen(RSAPrivateKey));
if ( Error ) { goto Return; }
Error = gcry_sexp_build(&PlainKeyExp, NULL, "(data (flags raw) (value %s))", AESKey );
gpg_strerror_r(Error, Output, 500);
if ( Error ) { goto Return; }
Error = gcry_pk_encrypt(&Encrypted, PlainKeyExp, PublicKey);
if ( Error ) { goto Return; }
if ( gcry_sexp_sprint(Encrypted, GCRYSEXP_FMT_CANON, Output, 500) <= 0 ) { Error = TRUE; goto Return; }
Encrypted = gcry_sexp_find_token(Encrypted, "a", 0);
if ( Encrypted == NULL ) { Error = TRUE; goto Return; }
if ( gcry_sexp_sprint(Encrypted, GCRYSEXP_FMT_ADVANCED, Output, 500) <= 0 ) { Error = TRUE; goto Return; }
if ( strtok(Output, "#") != NULL ) {
Output2 = strtok(NULL, "#");
if ( Output2 != NULL ) { sprintf(EncryptedKey,"%s", Output2); }
else { Error = TRUE; }
} else { Error = TRUE; }
Фрагмент кода декодирования
var modulus ="00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251";
var privateExponent ="046129f2489d71579be0a75fe029bd6cdb574ebf57ea8a5b0fda942cab943b117d7bb95e5d28875e0f9fc5fcc06a72f6d502464dabded78ef6b716177b83d5bdc543dc5d3fed932e59f5897e92e6f58a0f33424106a3b6fa2cbf877510e4ac21c3ee47851e97d12996222ac3566d4ccb0b83d164074abf7de655fc2446da1781";
var encryptedAesKey ="77FD84196959DDE3C367952B3C25B34582B489A705FB3C61D69D04DDA16B011F6358F32834DD76BF81A1DF28106F377FF1125F91CA39BB92D293B8F5134C15C17DE1157390723301A01B938489E04DA1D8D4A70511F0FF2508984710CEB3F18D4BA929C18487A0977011BDE169DBBF3047646FBFBC50ED5A02FC40E53E59B8CD";
try
{
// Convert to biginteger
var bcMod = new Org.BouncyCastle.Math.BigInteger(Hex.Decode(modulus));
var bcPrivateExponent = new Org.BouncyCastle.Math.BigInteger(Hex.Decode(privateExponent));
byte[] decodedAesKey = Hex.Decode(encryptedAesKey);
// Init bouncyCastle
var privParameters = new RsaKeyParameters(true, bcMod, bcPrivateExponent);
var eng = new Pkcs1Encoding(new RsaEngine());
eng.Init(false, privParameters);
var ret = eng.ProcessBlock(decodedAesKey, 0, 128);
}
catch (Exception e)
{
Console.WriteLine(e);
}
1 ответ
Ответ просто удалить new Pkcs1Encoding()
вызов конструктора и непосредственно использовать RsaEngine
, Если нет заполнения, тогда нет необходимости удалять или проверять его.
Обратите внимание, что заполнение является требованием для создания защищенного зашифрованного текста на основе RSA. Так что это нормально для преодоления проблем совместимости, но система должна быть заменена сразу.