復号化された文字列からパディングを削除するにはどうすればよいですか? RijndaelManaged プロバイダーを使用して暗号化と復号化を行っています。/0/0/0/0/0/0
復号化すると、文字列の最後にいくつかあります。私の質問は、結果の文字列から文字を適切に (適切に) 削除するにはどうすればよいですか?
4 に答える
おそらく、RijndaelManaged インスタンス (以下のコードではプロバイダーと呼ばれます) の正しいパディング モードとブロック モードを使用していません。.NET の対称暗号化プロバイダーはすべてブロック暗号であるため、これらの設定はパディングの動作 (および出力の安全性) に影響します。
以下の設定は、RijndaelManaged を使用する際に最適なセキュリティを提供します。
// set the padding algorithm
provider.Padding = PaddingMode.ISO10126; // default is PKCS7
// set the block chaining mode
provider.Mode = CipherMode.CBC;
あなたがデータを暗号化しているのではなく、発信者が使用した設定がわからない場合は、他の回答のいくつかで助けが得られます:)
このように使用することによりTrimEnd()
:
theString.TrimEnd("/0");
両方を暗号化する前に文字列の長さを文字列の先頭にプレフィックスし、復号化した後、その長さを使用して文字列がどこで終わるかを判断できます。
または、文字列を暗号化する前に base64 でエンコードし、後でデコードすることもできます。
または、暗号化する前に、バイナリまたは XML シリアライザーを使用してエンコードします。
これらの方法にはすべて、格納された文字列を正確に復元できるという利点があります。現在の出力を取得し、適用する変換を推測するメソッドには、そのプロパティがありません。
暗号化との関係がわかりません。IIUC 既に復号化が完了しており、最後に削除したいものがある平文の文字列があります。もしそうなら、あなたの質問は文字列操作に関するものであり、使用している暗号化アルゴリズムは関係ありません。でも、もしかして私が勘違いしてたのかな..?
提案(おそらく正しくありませんが、アイデアは得られます):
string pattern = (i % 2 == 0? "/0" : "0/");
var sb = new StringBuilder(s);
int i = s.Length - 1;
while (sb[i] == pattern[i % 2]) --i;
sb.Length = i;
s = sb.ToString();