Основываясь на Кодируя ответ Гориллы , я попробовал следующее в моем Decrypt
методе:
string decryptedString1 = string.Empty;
foreach (byte b in decryptedBytes)
{
decryptedString1 += (char)b;
}
string decryptedString2 = ByteConverter.GetString(decryptedBytes);
При отладке decryptedString1
и decryptedString2
не были равны:
decryptedString1 "m\0y\0V\0e\0r\0y\0L\0o\0n\0g\0V\03\0r\0y\05\03\0c\0r\03\07\0p\04\0s\0s\0w\00\0r\0d\0!\0!\0!\0"
decryptedString2 "myVeryLongV3ry53cr37p4ssw0rd!!!"
Похоже, я могу просто пройти через массив byte[]
, выполнить прямое приведение к char
и пропустить \0
символов.Как сказал Горилла по кодированию, это, похоже, опять отчасти лишает смысла SecureString
, потому что конфиденциальные данные плавают в памяти небольшими порциями byte
.Любые предложения, чтобы заставить RSACryptoServiceProvider.Decrypt
вернуть SecureString
напрямую?
Редактировать: Да, это работает:
var secStr = new SecureString();
foreach (byte b in decryptedBytes)
{
var c = (char)b;
if ('\0' == c)
{
continue;
}
secStr.AppendChar(c);
}
return secStr;
Редактировать: исправление: это работает с простыми старыми английскими строками.Шифрование, а затем попытка расшифровать строку "標準語 明治維新 english やった"
не работает должным образом, поскольку полученная расшифрованная строка, использующая эту технику foreach (byte b in decryptedBytes)
, не соответствует исходной незашифрованной строке.
Редактировать: , используя следующее, работает для обоих:
var secStr = new SecureString();
foreach (char c in ByteConverter.GetChars(decryptedBytes))
{
secStr.AppendChar(c);
}
return secStr;
Это все еще оставляет байтовый массив и массив символов пароля в памяти, что отстой.Может быть, я должен найти другой класс RSA, который возвращает SecureString
.: /