Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/92-b9a38985

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

下りの暗号化(ajax+rubyでRSA+Blowfish)

こちらのシーケンスの通りに実装した。(RC5でなくてBlowfishで)

RSA単体では、公開キーの長さ-11Byteまでしか暗号化できないので、こういう方法に落ち着くと思う。


#!/usr/local/bin/ruby
require 'cgi'
require 'erb'
require 'openssl'
require 'rubygems'
require 'crypt/blowfish'

KEY_FILE = 'private_key.pem'

rsa = OpenSSL::PKey::RSA.new(File.read(KEY_FILE))

cgi=CGI.new('html3')
if cgi.has_key?('key') then
key=rsa.private_decrypt(cgi['key'].unpack('m')[0])
str=DATA.read

bf=Crypt::Blowfish.new(key)
n=8-(str.length&7);
n.times do
str<<n.chr
end
en=''
(str.length>>3).times do |i|
p=i*8
en<<bf.encrypt_block(str[p,p+8])
end
cgi.out(){
[en].pack('m').gsub("\n", '')
}
else
cgi.out(){
cgi.html(){
cgi.body(){
ERB.new(DATA.read).result(binding)
}
}
}
end
__END__
<script src='base64.js' type='text/javascript'></script>
<script src='jsbn.js' type='text/javascript'></script>
<script src='prng4.js' type='text/javascript'></script>
<script src='rng.js' type='text/javascript'></script>
<script src='rsa.js' type='text/javascript'></script>
<script type='text/javascript' src='dojo-release-1.4.0/dojo/dojo.js'></script>
<script type='text/javascript' src='prototype.js'></script>
<script type='text/javascript'>
function randomStr(n){
var A = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var s = ''
for(;n>0;n--){
s += A.charAt(Math.floor(Math.random() * A.length));
}
return s;
}

rsa = new JSBN.RSA.RSAKey();
rsa.setPublic('<%= "%x" % rsa.n %>', JSBN.RSA.byte2Hex(<%= rsa.e %>));
var key = randomStr(56);

dojo.require('dojox.encoding.crypto.Blowfish');
function push(){
new Ajax.Request('<%= ENV['SCRIPT_NAME'] %>',{
method: 'post',
postBody: 'key='+encodeURIComponent(hex2b64(rsa.encrypt(key))),
onComplete: function(http){
var enc = http.responseText;
var dec = dojox.encoding.crypto.Blowfish.decrypt(enc, key);
alert(dec);
}
});
}
</script>
<input type='button' value='PUSH' onClick='push()'></input>

※全角文字の暗号化には未対応。

所感
httpsを使わないでもセキュアな通信は出来る。でも所詮はAjax通信なので、Formを使ってファイルをアップロードするとか、ファイルをダウンロードするとか、imgタグに埋め込んだ画像データを表示するとかって所をセキュアにする事はできない。つまりは結局のところhttpsを使わなくてはならない。ならば最初からhttpsを使うってのが普通だと思う。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/92-b9a38985

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。