このエントリーを含むはてなブックマークはてなブックマーク - JavaでRC4の算出(Androidをいじってます) この記事をクリップ!Livedoorクリップ - JavaでRC4の算出(Androidをいじってます) Yahoo!ブックマークに登録 このエントリをつぶやくこのWebページのtweets Googleブックマークに追加

Androidをコチョコチョと触ってます。

作っていたのが、Androidで取得した情報をサーバーへPOST → サーバーアプリで その情報を保存。
そこは簡単だったので、POSTする値を RC4化して、サーバへUpしようと。

RC4も、どこかでSampleを見つけて実装してみたのですが、PHPでのRC4算出値と結果が異なっていました。
仕方なく自分で調査と修正しました。

RC4の算出結果がPHPと違った原因ですが、Java では byteはsingned(-128~127)として扱われるので、単純に加算すると加算してたつもりがマイナスになってました。
Byte演算時にunsingned化する為に & 0xff する事でPHP側の算出結果と同じに。

参考のコードを掲載します。
テストで作ったものですし、動作保障はできませんが、やってる内容は単純なので結果が違う場合は、コツコツ追ってみてください。

※ ん~Javaにまだ慣れない・・・。

↓クリックでソースが展開されます。

public class nlRC4
{
	private byte [] bKey = new byte [256];
	private byte [] bBox = new byte [256];

	public nlRC4 (byte [] key)
	{
		this.setKey(key);
	}

	private void setKey (byte [] key)
	{
		for(int i = 0; i < bKey.length; i++ )
		{
			bKey[i] = key[i];
			bBox[i] = (byte)i;

			if( i >= key.length ){
				break;
			}
		}
	}

	public void SetKey (byte [] key)
	{
		this.setKey(key);
	}

	public void CryptRC4(byte[] srcData, int size, byte[] destData)
	{
		byte btmp;
		byte[] vbox = bBox.clone();

		for (int i = 0, l = 0; i < bKey.length; i++)
		{
			l = (l + (vbox[i] & 0xff) + ( bKey[i] & 0xff)) % bKey.length;
			btmp = vbox[i];
			vbox[i] = vbox[l];
			vbox[l] = btmp;
		}

		for (int i = 0, l = 0, j = 0; i < size; i++)
		{
			l = (l + 1) % bKey.length;
			j = (j + (vbox[l] & 0xFF)) % bKey.length;

			btmp = vbox[l];
			vbox[l] = vbox[j];
			vbox[j] = btmp;
			destData[i] = (byte)(srcData[i] ^ ( vbox[((((vbox[l] & 0xFF)) + (vbox[j] & 0xFF)) % bKey.length)] & 0xFF));
		}

	}

}