2011年2月28日月曜日

AndroidでRSAを使ってみた

RSAでの暗号化と復号化のシンプルなサンプルコードを書いてみた。

    public static byte[] encrypt(byte[] data)
            throws
                InvalidKeySpecException,
                NoSuchAlgorithmException,
                NoSuchPaddingException,
                InvalidKeyException,
                IllegalBlockSizeException,
                BadPaddingException
    {
        final Key publicKey =
            KeyFactory
            .getInstance("RSA")
            .generatePublic(new X509EncodedKeySpec(PUBLIC_KEY_BYTES));
        final Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }
    public static byte[] decrypt(byte[] data)
            throws
                InvalidKeySpecException,
                NoSuchAlgorithmException,
                NoSuchPaddingException,
                InvalidKeyException,
                IllegalBlockSizeException,
                BadPaddingException
    {
        final Key privateKey =
            KeyFactory
            .getInstance("RSA")
            .generatePrivate(new PKCS8EncodedKeySpec(PRIVATE_KEY_BYTES));
        final Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

ポイントは、Cipherのインスタンスを取得するときに、
フィードバックモードとパディングをちゃんと指定すること。

Cipher.getInstance("RSA") // これは悪い例!

同じJavaVM環境なら、こうやって書いても期待通りに動いてしまう。

フィードバックモードおよびパディングを省略すると、
プロバイダ固有のデフォルト値が使われると書いてある。

同じJavaVM環境ならプロバイダーが同じだからデフォルト値も同じなので問題がないというわけ。

ところが、
Sun(Oracle)のJREやJDKにバンドルされているJCEプロバイダのデフォルトはSunJCEで、
Androidの場合はBouncyCastleのようだ。

SunJCEの場合
"RSA"は"RSA/ECB/PKCS1Padding"
がデフォルトみたい。

BouncyCastleの場合は
"RSA"は"RSA/None/NoPadding"
がデフォルトみたい。

これらはたまたま手元の環境で動かしたらそうなっただけで、
デフォルト値が未来永劫変わらない保証はない。

というわけで、フィードバックモードとパディングを省略すると
サーバとAndroid端末の間で渡したデータを復号化できなくなると思った方がよい。

2011年2月2日水曜日

ChromeでDesktop Notificationしてみた

Chromeのみ。
GmailがChrome Extensionなしで新着通知してくれるようになったのでやってみた。
  • 許可を得ないと機能しない。
  • 許可を得るためにはユーザのアクションが必要。(自動的に許可を求めることはできない)
ということで、初めてボタンをクリックした時は許可を与えてやるべし。
それから、もう一回ボタンをクリックするべし。
<input id="showNotification" type="button" value="show notification" onclick="showNotification()">
<script>
if (!window.webkitNotifications) {
  document.getElementById('showNotification').disabled = "disabled";
}
function showNotification() {
  if (window.webkitNotifications.checkPermission() == 0) {
    var icon = 'https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzc7Z4tgITpt9OABl3LvK8zrzmRQPhszoIVx67rc6XsNGSnK3S3ZT9BS-FpJFK8fjNFKprTax2o0-lRRMz6f1nqdlsQ5Lb50aDVQSAc5tW_eIa45kTAggLtD2-2mrkEZDrJDvzT2LSAg/';
    var title = 'Chrome Notification Sample';
    var message = 'This works only with Google Chrome Web Browser.';
    var n = window.webkitNotifications.createNotification(icon, title, message);
    n.ondisplay = function() {
      setTimeout(function() { n.cancel(); }, 5000);
    };
    n.show();
  } else {
    window.webkitNotifications.requestPermission();
  }
}
</script>

2011年1月26日水曜日

Android Screenshots, Screen Capture, Screen Cast

これは便利だ。

USB接続したAndroidの画面をどんどんキャプチャ―してPNGに保存してくれる。

Android Screenshots, Screen Capture, Screen Cast



AndroidScreenCapture-1.1.zipをダウンロードして実行。

android-sdk_r08-windows.zipでは動かない。
android-sdk_r07-windows.zipを使ったら動いた!
sdkのディレクトリ構造が変わったのが原因だろうな。

ダウンロードはsourceforgeから。

2011年1月13日木曜日

Google APIsとGALAXY Tabのエミュレータ

android-sdkでSamsung GALAXY Tabのエミュレータを簡単に作成できる。

でも、残念ながらGoogle APIs、たとえばGoogle Maps APIを使ったapkを実行できない。

しかたがないので600x1024サイズのAVDを使うことにする。

Google APIs(Google Inc.) - API Level 8をTargetにしたAVDを作成してから、

~/.android/avd/AVDNAME.avd/config.iniのskin.pathを

add-ons/addon_galaxy_tab_samsung_electronics_8/skins/GALAXY Tab

にすると、GALAXY Tabの画面サイズにできる。

動作に影響はしないみたいだけれどskin.nameもGALAXY Tabにしておいた。

2011年1月8日土曜日

開いているページのURLをQRコードにするブックマークレット

開いているページのURLをQRcodeにするブックマークレット(iPhone用)
※iPhone用の場合
  1. リンク先をブックマークに保存した後で
  2. 保存したブックマークのURLの先頭から「javascript:」までを削除すること。
javascript:void((function(){window.location.href='http://takumakei.blogspot.com/2011/01/qrweb.html?qrcodeInputText='+encodeURIComponent(window.location.href);})());

2011年1月7日金曜日

QRコードを作るWebアプリ




このページのQRコード

<!DOCTYPE html>
<html>
<head>
<title>QRcode</title>
<style type="text/css">
.qrcodecenter{margin-left:auto;margin-right:auto;text-align:center}
</style>
<script>
function updateQrcodeView() {
  var src = document.getElementById('qrcodeInputText').value;
  var qrcodeView = document.getElementById('qrcodeView');
  qrcodeView.src =
    'http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl='
    + encodeURIComponent(src);
  qrcodeView.style.visibility = 'visible';
  var qrcodeText = document.getElementById('qrcodeText');
  qrcodeText.innerText = src;
}
</script>
</head>
<body>
<div class="qrcodecenter">
<input id="qrcodeInputText" type="text" size="40" placeholder="text here">
<input type="button" value="QRcode" onclick="javascript:updateQrcodeView();">
</div>
<div class="qrcodecenter">
<image id="qrcodeView" style="visibility:hidden">
</div>
<div id="qrcodeText" class="qrcodecenter"></div>
</body>
</html>

2011/01/08 01:18am ちょっと修正

2010年12月20日月曜日

「VC 2010 Expressでx64コンパイル」を見つけて嬉しかったのでメモ

VC 2010 Expressでx64コンパイル(How to compile x64 app with VC 2010 Express)
mnemotoさんありがとう
<?xml version=”1.0″ encoding=”utf-8″?>
<Project DefaultTargets=”Build” ToolsVersion=”4.0″ xmlns=”http://schemas.microsoft.com/developer/msbuild/2003“>
  <PropertyGroup>
    <SourcePath>$(SourcePath)</SourcePath>
    <IntDir>$(SolutionDir)$(Platform)\$(Configuration)\</IntDir>
    <IncludePath>C:\Program Files\Microsoft SDKs\Windows\v7.1\Include;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include</IncludePath>
    <LibraryPath>C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64</LibraryPath>
   
    <TrackFileAccess>false</TrackFileAccess>
  </PropertyGroup>
</Project>
set “PATH=%PATH%;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64″
set “INCLUDE=C:\Program Files\Microsoft SDKs\Windows\v7.1\Include;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include”
set “LIB=C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64″
bjam release debug threading=multi link=static runtime-link=static toolset=msvc address-model=64