質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

C#で暗号化した値をjavascriptで復号化する方法は

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,127

imasara_9

score 11

C# で、以下のような処理で数字を暗号化し、
これをテキストファイルに書き込んでウェブサーバーにFTPします。


{
string encrypted = sub("1234"); // なにか4桁の数字

// encryptedを埋め込んだテキストファイルを作成し
// FTPでウェブサーバーにアップロードする
}

void sub(string source)
{
string password = "encryptkey";
RijndaelManaged rijndael = new RijndaelManaged();
byte[] key, iv;
GenerateKeyFromPassword(password, rijndael.KeySize, out key, rijndael.BlockSize, out iv);
rijndael.Key = key;
rijndael.IV = iv;
byte[] strBytes = Encoding.UTF8.GetBytes(source);
ICryptoTransform encryptor = rijndael.CreateEncryptor();
byte[] encBytes = encryptor.TransformFinalBlock(strBytes, 0, strBytes.Length);
encryptor.Dispose();
string encrypted = Convert.ToBase64String(encBytes);
string encrypted = Convert.ToBase64String(encBytes);
}

void GenerateKeyFromPassword(string password, int keySize, out byte[] key, int blockSize, out byte[] iv)
{
byte[] salt = Encoding.UTF8.GetBytes("12345678");
Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(password, salt);
deriveBytes.IterationCount = 1000;
key = deriveBytes.GetBytes(keySize / 8);
iv = deriveBytes.GetBytes(blockSize / 8);

}

そのテキストファイルをウェブクライアントのjQueryで読み込んで復号し、
jQuery内で保持している数字と比較したいのですが、
jQueryで復号する方法が分かりません。

CryptoJSでできそうな気がしていて、
例えばネットで拾った


var key = CryptoJS.PBKDF2('encryptkey', salt, {keySize: 256 / 8, iterations: 1000 });
var options = {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7};

var decrypted = CryptoJS.AES.decrypt({ciphertext:encrypted}, key, options);

などが使えそうに思ったのですが、
この場合、saltとivの値が分かりません。
C#の方でsaltとivはbyte配列で求められているので、
これをint32配列に変換したものを試しにjQueryにベタ書きして渡してみたのですが、
CryptoJS.PBKDF2()が"Cannot read preoperty 'length' of undefined"例外を起こします。

上記のソースの問題点のご指摘でも、まったく別のアプローチでも結構です。
C#で暗号化した値をjavascriptで復号化する方法をご教授ください。

よろしくお願い致します。

因みに、jQuery内で比較値をベタで保持した場合にクライアントでは隠しようのないことは、
とりあえずここでは問題にしません。
あくまで暗号化/復号化の方法に焦点を当てたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まず、実現しようとしていること自体が妥当であるかをもう一度ご検討ください。

AES、共通鍵暗号をWebクライアントで復号させるなら、復号に必要な情報はすべてクライアントに渡すことになります。そして、JSの実行時情報はブラウザ上で誰でも覗くことができます。鍵が丸見え、暗号の意味をなしていないということになります。
もし、通信路さえ暗号化できていれば十分であり、Webクライアントのユーザーに鍵が知られることは問題ないというのであれば、それはHTTPSで十分ということになります。
どういった理由で暗号化を必要としているのですか?


(追記)あ、最後の最後で、妥当性については今は考えないとありましたか。読み落としていました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/02 12:54

    回答をありがとうございます。
    いや、確かにyuba様のおっしゃるように、意味のないことしています。
    せっかく今回teratailに登録して質問までしたのですが、やはり別の方法を考えます...。

    やりたいことは、認証です。
    ベーシック認証もサーバーサイドプログラムも使用せず、
    簡易的な認証を実現したかった次第です。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る