zebedee のような vpn の代替としての StreamRelay.jar

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

StreamRelay.jar にはストリームに暗号処理を被せる事ができるため、VPN(Zebedee)の代替のようなことを行わせることもできる。

---
### 諸注意

zebedee プロトコル互換ではないし、zebedee のようなマルチプロトコルを含有できるようなものでもなく、あくまで通信を暗号化する、そして、鍵交換を安全に行う、という内容です

---
### クライアント側(タイプ1)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemoteHost 192.0.2.1 -RemotePort 10990 -RemoteCipherAlgorithm RC4 -RemoteCipherDH`

「remote」と呼称される側のストリーム側に

- 暗号アルゴリズムは RC4
- 鍵交換に DH

---
### サーバ側(タイプ1)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemoteHost 192.0.2.2 -RemotePort 80 -LocalCipherAlgorithm RC4
 -LocalCipherDH`

「local」と呼称される側のストリーム側も

- 暗号アルゴリズムは RC4
- 鍵交換に DH

---
### クライアント側(タイプ2)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 10990 -RemoteHost 192.0.2.1 -RemoteCipherAlgorithm AES/OFB8/NoPadding -RemoteCipherPassword abcdefgh -RemoteAlgorithmParameters [サーバ側で出力されたAlgorithmParameterを指定する]`

「remote」と呼称される側のストリーム側に

- 暗号アルゴリズムは AES
- 鍵交換は使わずに事前共有鍵をセットしている
- サーバ側で出力される「AlgorithmParameter」も事前共有しておく必要がある

---
### サーバ側(タイプ2)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalCipherAlgorithm AES/OFB8/NoPadding -LocalCipherPassword abcdefgh -CalculateAlgorithmParameters`

「local」と呼称される側のストリーム側も

- 暗号アルゴリズムは AES
- 鍵交換は使わずに事前共有鍵をセットしている

---
### クライアント側(タイプ3)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 10990 -RemoteHost 192.0.2.1 -RemoteCipherAlgorithm AES/CTR/NoPadding -RemoteCipherPassword abcdefgh -RemoteAlgorithmParameters [サーバ側で出力されたAlgorithmParameterを指定する]`


「remote」と呼称される側のストリーム側に

- 暗号アルゴリズムは AES
- モードを CTR にする事でブロック暗号がストリーム暗号のように1バイト毎に出力される
- 鍵交換は使わずに事前共有鍵をセットしている
- サーバ側で出力される「AlgorithmParameter」も事前共有しておく必要がある

---
### サーバ側(タイプ3)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalCipherAlgorithm AES/CTR/NoPadding -LocalCipherPassword abcdefgh -CalculateAlgorithmParameters`

「local」と呼称される側のストリーム側も

- 暗号アルゴリズムは AES
- モードを CTR にする事でブロック暗号がストリーム暗号のように1バイト毎に出力される
- 鍵交換は使わずに事前共有鍵をセットしている
- サーバ側で出力される「AlgorithmParameter」も事前共有しておく必要がある

---
### クライアント側(タイプ4)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 90 -RemotePort 10990 -RemoteHost 192.0.2.1 -RemoteZLIBCommpress -RemoteCipherAlgorithm AES/CTR/NoPadding -RemoteCipherPassword abcdefgh -RemoteAlgorithmParameters [サーバ側で出力されたAlgorithmParameterを指定する]`

「remote」と呼称される側のストリーム側に

- 暗号アルゴリズムは AES
- モードを CTR にする事でブロック暗号がストリーム暗号のように1バイト毎に出力される
- 鍵交換は使わずに事前共有鍵をセットしている
- サーバ側で出力される「AlgorithmParameter」も事前共有しておく必要がある
- バッファリングょしない zlib 圧縮を指定

---
### サーバ側(タイプ4)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 10990 -RemotePort 80 -RemoteHost 192.0.2.2 -LocalZLIBCommpress -LocalCipherAlgorithm AES/CTR/NoPadding -LocalCipherPassword abcdefgh -CalculateAlgorithmParameters`

「local」と呼称される側のストリーム側も

- 暗号アルゴリズムは AES
- モードを CTR にする事でブロック暗号がストリーム暗号のように1バイト毎に出力される
- 鍵交換は使わずに事前共有鍵をセットしている
- サーバ側で出力される「AlgorithmParameter」も事前共有しておく必要がある
- バッファリングょしない zlib 圧縮を指定

---
### 鍵交換アルゴリズム

Java には DH 法と ECDH 法が標準されていた。

当然、事前共有鍵をセットして、それを使う、という事も可能ですよ

---
### 圧縮

-(Local|remote)ZLIB(DeCommpress/Commpress) を指定する事でバッファリングしない zlib圧縮が可能だ

---
### 暗号一般

[ファイル暗号化コマンドとしての StreamRelay.jar](http://qiita.com/tomoki0sanaki/items/a5971199d7f20806280b)

---
### ブロックサイズ

暗号アルゴリズムとか、暗号モードによっては、ストリーム暗号のように1Byte単位にする事もできる

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)