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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

1回答

4963閲覧

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

imasara_9

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

1クリップ

投稿2016/06/01 10:29

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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


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

投稿2016/06/02 00:21

編集2016/06/02 00:41
yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imasara_9

2016/06/02 03:54

回答をありがとうございます。 いや、確かにyuba様のおっしゃるように、意味のないことしています。 せっかく今回teratailに登録して質問までしたのですが、やはり別の方法を考えます...。 やりたいことは、認証です。 ベーシック認証もサーバーサイドプログラムも使用せず、 簡易的な認証を実現したかった次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問