DOBON.NETプログラミング道掲示板

■35135 / 親記事)  特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
  
□投稿者/ わっしー 一般人(1回)-(2022/08/24(Wed) 21:33:40)
  • アイコン環境/言語:[Windows10] 
    分類:[.NET] 

    インストーラーを作成して、社内の人に配布をして利用していただいております。
    100人以上の方に問題なく使っていただけてますか、1名だけ「パディングは無効なので削除できません」とエラーが発生します。
    アンインストール→インストールを何度か試していただきましたが改善せず
    再度インストーラーを作り直して、インストールしてみましたが改善できませんでした。

    コード内に暗号化/復号の処理があるため、そこでのエラーと思われますが、特定のPCだけで発生しているため、全く原因がわからない状態です。

    皆様にお力添えいただきたく、よろしくお願いいたします。
450×167 => 250×92
イメージ
1661344420.png
/16KB
マルチポストを報告
違反を報告
引用返信 削除キー/
■35137 / ResNo.1)  Re[1]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1445回)-(2022/08/25(Thu) 01:56:54)
  • アイコンNo35135に返信(わっしーさんの記事)
    > 1名だけ「パディングは無効なので削除できません」とエラーが発生します。
    [詳細(D)]ボタンを開くと、エラー箇所のスタックトレースが表示されませんか?


    > コード内に暗号化/復号の処理があるため、そこでのエラーと思われますが、
    暗号化における「パディング」の意味はご存知でしょうか。
    https://www.tohoho-web.com/ex/crypt.html#padding

    どのような暗号化処理を行っているのかにもよりますが、
    たとえば AES (Rijndael) を用いているとすれば、そのエラーは

    (1)暗号化時と復号化時で、Padding プロパティの指定が間違っている

    (2)初期化ベクトル(IV)かパスワードが間違っていて変換に失敗している

    (3)データ長がちょうどブロック長の倍数と一致していたため、
     「末尾に空のパディングを付与」or「パディングを付与しない」の
     いずれのルールになるべきかが、暗号化時と復号化時でブレている

    などのケースで発生する可能性があります。


    ということで、まずは暗号化時と復号化時の Padding 指定を確認してください。

    たとえば(3)のケースなら、復号時に PaddingMode.None を指定すれば
    パディングの自動削除が行われなくなるので、複合後のデータ末尾のブロックを
    自分で読み取って判断し、不要なパディング部を自力で除去するといった
    補正を行うこともできるでしょう。

    参考情報としてこのあたり。
    https://social.msdn.microsoft.com/Forums/security/ja-JP/fbd89c41-0af8-4b1a-8106-fa9a69e4488b/24489214952127012395123881235612390?forum=vbgeneralja
違反を報告
引用返信 削除キー/
■35138 / ResNo.2)  Re[2]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1446回)-(2022/08/25(Thu) 02:12:25)
  • アイコンNo35137に追記(魔界の仮面弁士の記事)
    > 参考情報としてこのあたり。
    > https://social.msdn.microsoft.com/Forums/security/ja-JP/fbd89c41-0af8-4b1a-8106-fa9a69e4488b/24489214952127012395123881235612390?forum=vbgeneralja

    もう一つこの辺りの回答も。手前味噌ですが。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=78391&KLOG=133
違反を報告
引用返信 削除キー/
■35139 / ResNo.3)  Re[2]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(2回)-(2022/08/26(Fri) 13:11:37)
  • アイコンNo35137に返信(魔界の仮面弁士さんの記事)

    ご回答ありがとうございます。
    URLを参照してパディングに意味がわかりました。

    暗号化/復号は下記のURLの内容をそのまま使用しています。
    https://dobon.net/vb/dotnet/string/encryptfile.html

    上記の方法の場合にご指摘いただいた理由でエラーになる可能性はございますでしょうか?

    エラー画面の詳細のキャプチャも添付させていただきます。

    恐れ入りますが、よろしくお願いいたします。

1184×160 => 250×33
イメージ
1661487093.png
/14KB
違反を報告
引用返信 削除キー/
■35140 / ResNo.4)  Re[3]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1447回)-(2022/08/26(Fri) 15:00:58)
  • アイコンNo35139に返信(わっしーさんの記事)
    > エラー画面の詳細のキャプチャも添付させていただきます。
    Visual Basic をお使いのようですね。では VB の文法で回答します。


    > 暗号化/復号は下記のURLの内容をそのまま使用しています。
    > https://dobon.net/vb/dotnet/string/encryptfile.html
    そのページには複数の実装がありますよね…?
    今回はスタックトレースを貼って頂いたので、

    https://dobon.net/vb/dotnet/string/encryptfile.html#codecaption1
    Sub DecryptFile(sourceFile As String, destFile As String, key As Byte(), iv As Byte())

    ではなく

    https://dobon.net/vb/dotnet/string/encryptfile.html#codecaption5
    Sub DecryptFile(sourceFile As String, destFile As String, password As String)

    の方であることは分かりましたが、もう少し具体的に示して欲しかったです。
    (サイトでは Shared Sub になっていましたが、Module1 上なので Shared を外しているものと想像)


    ちなみに、.NET Core においては、RijndaelManaged クラスは非推奨とされており、
    かわりに Aes.Create メソッドを使うべきとアナウンスされていたりします。
    もっとも .NET Framework の場合は、 Obsolete にはなっていないのですけれどね。
    (AES と Rijndael の違いについては、ここでは触れずにおきます)

    一応念のため、.NET Framework バージョンも教えてください。


    > 上記の方法の場合にご指摘いただいた理由でエラーになる可能性はございますでしょうか?
    どうでしょうね。今ちょっと、検証やコードレビューする余裕が無いのです…。

    ただ、既定のパラメーターの場合、CBC の PKCS#7 パディングになっているはず。


    なのでひとまず、復号側の実装で、
     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
    の行を
     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
     rijndael.Padding = System.Security.Cryptography.PaddingMode.None
    に変更してみてください。


    本当にパディングだけの問題なら、復号後のファイルサイズは 16 の倍数バイトとなり、
    復号されたデータの末尾に最大 16 バイトのゴミデータが付与されるはずです。
    (末尾にゴミが付く点を除けば、暗号化は正しく解除されるはず)

    この末尾データは、16 の倍数に揃えるためのパディングデータであり、
    「末尾 16 バイトがすべて &H10」
    「末尾 15 バイトがすべて &H0F」
    「末尾 14 バイトがすべて &H0E」
    「末尾 13 バイトがすべて &H0D」
      :
      :
    「末尾 3 バイトがすべて &H03」
    「末尾 2 バイトがすべて &H02」
    「末尾 1 バイトが &H01」
    のいずれかになります。
    たとえば元が 0 バイトのファイルであった場合、復号したファイルは
    &H10 のみでパディングされた 16 バイトになるということです。


    もし、末尾が上記いずれのパターンでも無かった場合や、あるいは
    それでも途中でエラーになるようであれば、暗号化されたファイル
    もしくはパスワードのいずれかが破損している事を意味するでしょう。
違反を報告
引用返信 削除キー/
■35142 / ResNo.5)  Re[4]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ 魔界の仮面弁士 大御所(1448回)-(2022/08/26(Fri) 16:04:40)
  • アイコン2022/08/26(Fri) 16:05:59 編集(投稿者)

    No35140に追記(魔界の仮面弁士の記事)
    > それでも途中でエラーになるようであれば、暗号化されたファイル
    > もしくはパスワードのいずれかが破損している事を意味するでしょう。

    ファイルのサイズが「16 の倍数バイト」であるかどうかを確認する作業は
    『暗号化されたファイルのサイズ』と
    『Padding なしで複号した結果ファイル』の
    両方に対して行ってください。

    暗号データが 16 の倍数バイトでは無い場合は、
    暗号データ自体の破損を意味します。
違反を報告
引用返信 削除キー/
■35143 / ResNo.6)  Re[5]: 特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因
□投稿者/ わっしー 一般人(3回)-(2022/08/26(Fri) 21:33:41)
  • アイコンNo35142に返信(魔界の仮面弁士さんの記事)
    > 2022/08/26(Fri) 16:05:59 編集(投稿者)

    ありがとうございます。

    .NET Frameworkはバージョン4.6になります。

    すみません、仰る通り、サイトの2つ目の方の暗号化/復号を利用しており
    Module1にPublic Sub で記載しており、別のForm部分から呼び出すようにしています。


     Dim rijndael As New System.Security.Cryptography.RijndaelManaged()
     rijndael.Padding = System.Security.Cryptography.PaddingMode.None
    に変更して、インストーラーを作成して、エラーが出ているPCで試してみます。

    私のPCではエラーはでないのですが、暗号化されているファイルは16の倍数バイトになっていました。
    エラーが出ているPCで、どうなっているかも確認してみます。


違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -