none
共通鍵暗号化した文字列を復号しようとしたら「パディングが~」エラー RRS feed

  • 質問

  • text="4068289"、password="pb5n2zpc.30o"、として、下記のソースで共通鍵暗号化をしましたが、

    「複号できるか点検」のところで復号しようとしたら、「パディングは無効なので、削除できません。」となり復号できませんでした。

    他のパスワードで実行しても同じです。原因&改善方法はどのようなものでしょうか?

    ※「パスワードから共有キーと初期化ベクタ作成」は、key・ivがByrefで他はByvalです。同じパスワードから、要素数・代入された値が同じkey・ivを出せてます

    <ソースコード>

     Private Function 暗号化または復号_不可は空文字列(ByVal toango As Boolean,
                                         ByVal text As String, ByVal password As String) As String
            Dim kekka As String
            Const fail As String = ""
            Try
                '==befarrを作成
                Dim befarr() As Byte
                ReDim befarr(-1)
                If toango Then
                    befarr = System.Text.Encoding.UTF8.GetBytes(text & "")
                Else
                    befarr = System.Convert.FromBase64String(text & "")
                End If
                '==共通鍵を作成
                Dim obj As New Security.Cryptography.RijndaelManaged
                Dim key() As Byte, iv() As Byte
                ReDim key(-1) : ReDim iv(-1)
                If パスワードから共有キーと初期化ベクタ作成(password, obj.KeySize, obj.BlockSize, key, iv) = False Then
                    Return fail : Exit Function
                End If
                '==暗号化または復号しaftarrとおく
                Dim aftarr() As Byte
                '(angoobjを作成
                Dim angoobj As Security.Cryptography.ICryptoTransform
                If toango Then
                    angoobj = obj.CreateEncryptor
                Else
                    angoobj = obj.CreateDecryptor
                End If
                '(実行
                aftarr = angoobj.TransformFinalBlock(befarr, 0, befarr.Length)
                '==文字列に変換
                kekka = ""
                If toango Then
                    kekka = System.Convert.ToBase64String(aftarr)
                Else
                    kekka = System.Text.Encoding.UTF8.GetString(aftarr)
                End If
                '==復号できるか点検
                Dim test As String = ""
                If toango Then
                    test = 暗号化または復号_不可は空文字列(False, kekka, password)
                    If test & "" = "" OrElse
                       test & "" <> text & "" Then
                        Return fail : Exit Function
                    End If
                End If
            Catch ex As Exception
                Return fail : Exit Function
            End Try

            Return kekka
        End Function

    <ソースコードここまで>

    2017年9月21日 20:28

すべての返信

  • > Dim obj As New Security.Cryptography.RijndaelManaged
    > Dim key() As Byte, iv() As Byte
    > ReDim key(-1) : ReDim iv(-1)
    > If パスワードから共有キーと初期化ベクタ作成(password, obj.KeySize, obj.BlockSize, key, iv) = False Then

    この部分、ローカル変数keyとivに値が設定しているようですが、その後これらの変数は参照されておらず、objに設定されていません。

    2017年9月21日 22:44
  • こんにちは。

    https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx

    CreateEncryptor() CreateDecryptor()

    それぞれのタイミングでKEYとIVを渡すオーバーロードを使ってみては如何ですか。
    またはそのタイミングでObjectのKEYとIVが暗号化と復号化で正しくわたっているか確認してください。

    2017年9月21日 22:48
    モデレータ
  • KーTS さん、こんにちは
    フォーラム オペレーターの立花楓です。
     
    本件についてしばらくお時間が経ちましたが、その後いかがでしょうか。
    佐祐理 さん、Tak1wa さんにお寄せいただいた情報がご参考になると思いましたので、ご確認いただき、なにか進展がございましたらこちらのスレッドへご返信いただけますと幸いです。

    情報が参考になった場合には対象の回答に [回答としてマーク] をお願いいたします。

    よろしくお願いします。


    MSDN/TechNet Community Support 立花楓

    2017年10月2日 6:13
    モデレータ