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

質問
-
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 IfCatch ex As Exception
Return fail : Exit Function
End TryReturn kekka
End Function<ソースコードここまで>
すべての返信
-
> 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に設定されていません。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月22日 0:19
-
こんにちは。
https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx
CreateEncryptor() CreateDecryptor()
それぞれのタイミングでKEYとIVを渡すオーバーロードを使ってみては如何ですか。
またはそのタイミングでObjectのKEYとIVが暗号化と復号化で正しくわたっているか確認してください。- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月22日 0:19
-
KーTS さん、こんにちは
フォーラム オペレーターの立花楓です。
本件についてしばらくお時間が経ちましたが、その後いかがでしょうか。
佐祐理 さん、Tak1wa さんにお寄せいただいた情報がご参考になると思いましたので、ご確認いただき、なにか進展がございましたらこちらのスレッドへご返信いただけますと幸いです。情報が参考になった場合には対象の回答に [回答としてマーク] をお願いいたします。
よろしくお願いします。
MSDN/TechNet Community Support 立花楓