Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

.NET (C#) System.Security.Cryptography

43 views
Skip to first unread message

Yasushi Shinjo

unread,
Jan 20, 2008, 5:32:21 AM1/20/08
to
新城@筑波大学情報です。こんにちは。

うちの若いものが、C# (.NET) で暗号のプログラムを書いています。
initial vector というのが出てくるのですけれど、単に AES の暗
号化、複合化だけしたい時(フィードバック・モードを使わない時)
には、initial vector というのは不要ですよね。でも、.NET の
API では、出てきてしまって、ある種難渋しています。

普通の暗号プログラマなら困らないのでしょうか?

AES の API は、たとえばここにあります。

http://msdn2.microsoft.com/ja-jp/library/system.security.cryptography.aes_members.aspx

他にまともな API は .NET (C#) にはないのでしょうか。IV フィー
ルドに暗号化したいデータを突っ込んでも、取出せない取出す方法
が見つかりません。

Exclusive OR は、かけてもいい時には、CreateEncryptor() して
ICryptoTransform で受けて、TransformBlock() で良さそうです。
今はそれでもいいんだけれど、なんか毎回オブジェクトを作るのも
重そうだし。

CTR モードがあれば、それでもいいんだれれど。ぼそっ。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

Yoshitaka Ikeda

unread,
Jan 20, 2008, 5:47:33 AM1/20/08
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 新城@筑波大学情報です。こんにちは。
>
> うちの若いものが、C# (.NET) で暗号のプログラムを書いています。
> initial vector というのが出てくるのですけれど、単に AES の暗
> 号化、複合化だけしたい時(フィードバック・モードを使わない時)
> には、initial vector というのは不要ですよね。でも、.NET の
> API では、出てきてしまって、ある種難渋しています。
>
> 普通の暗号プログラマなら困らないのでしょうか?
>
> AES の API は、たとえばここにあります。
>
> http://msdn2.microsoft.com/ja-jp/library/system.security.cryptography.aes_members.aspx
>
> 他にまともな API は .NET (C#) にはないのでしょうか。IV フィー
> ルドに暗号化したいデータを突っ込んでも、取出せない取出す方法
> が見つかりません。

ModeをECBにしてやれば、IVは無視すると思います.
他のモード(CBCとかCTRなら)だと使うと思いますが.
って、CTRはないのか.

> Exclusive OR は、かけてもいい時には、CreateEncryptor() して
> ICryptoTransform で受けて、TransformBlock() で良さそうです。
> 今はそれでもいいんだけれど、なんか毎回オブジェクトを作るのも
> 重そうだし。
>
> CTR モードがあれば、それでもいいんだれれど。ぼそっ。

悩むくらいなら、AESくらいなら組んじゃった方が速いかも.

--
I LOVE SNOOPY! でつ
Yoshitaka Ikeda mailto:ik...@4bn.ne.jp
My Honeypot: ho...@4bn.ne.jp <-don't send this address

Yasushi Shinjo

unread,
Jan 21, 2008, 11:21:00 PM1/21/08
to
新城@筑波大学情報です。こんにちは。

In article <86bq7gr...@bsd2.4bn.ne.jp>


Yoshitaka Ikeda <ik...@4bn.ne.jp> writes:
> > 他にまともな API は .NET (C#) にはないのでしょうか。IV フィー
> > ルドに暗号化したいデータを突っ込んでも、取出せない取出す方法
> > が見つかりません。
> ModeをECBにしてやれば、IVは無視すると思います.

なるほど。Exclusive OR は、後で自分で取ると。Exclusive OR を
自分でやるとでも最後の Padding も、自分でやらないといけない
のか。

> 他のモード(CBCとかCTRなら)だと使うと思いますが.
> って、CTRはないのか.

C# (.NET) にはみつかりません。

Java には CTR モードはありましたが、カウンタ値を設定する方法
がみつからなくて。これって、OFB の単純化って書いてあるけど、
頭からシーケンシャルって意味なのかな。ランダム・アクセスって
どうするんだろう。CTR モード使いたいのは、ランダム・アクセス
できるからなんだけど。

http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/StandardNames.html
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/crypto/CryptoSpec.html

CTR の nonce やカウンタのビット長はどうやって指定するんだろう。

> > CTR モードがあれば、それでもいいんだれれど。ぼそっ。
> 悩むくらいなら、AESくらいなら組んじゃった方が速いかも.

素人には、けっこう難しいです。若者の演習にはよいかもしれませ
んが。その辺り、バグで責任取りたくないというのが本当の所。

Yoshitaka Ikeda

unread,
Jan 22, 2008, 2:25:54 AM1/22/08
to
池田です。SCIS参加中。

y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 新城@筑波大学情報です。こんにちは。
>
> In article <86bq7gr...@bsd2.4bn.ne.jp>
> Yoshitaka Ikeda <ik...@4bn.ne.jp> writes:
>> > 他にまともな API は .NET (C#) にはないのでしょうか。IV フィー
>> > ルドに暗号化したいデータを突っ込んでも、取出せない取出す方法
>> > が見つかりません。
>> ModeをECBにしてやれば、IVは無視すると思います.
>
> なるほど。Exclusive OR は、後で自分で取ると。Exclusive OR を
> 自分でやるとでも最後の Padding も、自分でやらないといけない
> のか。

ECBはそこら辺は見ないので、当然Paddingは自分でやる必要があります。

>> 他のモード(CBCとかCTRなら)だと使うと思いますが.
>> って、CTRはないのか.
>
> C# (.NET) にはみつかりません。
>
> Java には CTR モードはありましたが、カウンタ値を設定する方法
> がみつからなくて。これって、OFB の単純化って書いてあるけど、
> 頭からシーケンシャルって意味なのかな。ランダム・アクセスって
> どうするんだろう。CTR モード使いたいのは、ランダム・アクセス
> できるからなんだけど。

OFBとは全く違います。OFBはどちらかというとフィードバックシフトレジスタの
フィードバック関数がブロック暗号になったというイメージのほうが正しいです。

CTRは、出力とは全く関係ないカウンタが逐次変わっていきます。
一般にはインクリメントが実装されることが多いです。ランダムアクセスが楽だし。

> http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/StandardNames.html
> http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/crypto/CryptoSpec.html

訳がわるいのか原文がわるいのか。暗号のことを知らない人が書いた文章にしかみえない。
initメソッドで設定できるように読めるけど、どれを使えばいいのかわかんないし。

> CTR の nonce やカウンタのビット長はどうやって指定するんだろう。

CTRのカウンタは多分ブロック長と同じです。ブロック長より長く取ろうと思ったら、
インクリメントではだめです。1周した後同じ入力になっちゃうし。
#LFSRを使ったり、ハッシュ関数をはさんだりすればOK

>> > CTR モードがあれば、それでもいいんだれれど。ぼそっ。
>> 悩むくらいなら、AESくらいなら組んじゃった方が速いかも.
>
> 素人には、けっこう難しいです。若者の演習にはよいかもしれませ
> んが。その辺り、バグで責任取りたくないというのが本当の所。

オープンソースな何かから引っ張ってくるとか。
http://xyssl.org/code/source/aes/
これとか。

Yasushi Shinjo

unread,
Jan 23, 2008, 1:47:46 AM1/23/08
to
新城@筑波大学情報です。こんにちは。

In article <86odbe8...@bsd2.4bn.ne.jp>


Yoshitaka Ikeda <ik...@4bn.ne.jp> writes:
> > CTR の nonce やカウンタのビット長はどうやって指定するんだろう。
> CTRのカウンタは多分ブロック長と同じです。

CTR モードの場合、たとえば、128 ビットのブロックを暗号化する
なら、上位、64 ビットに noce を入れて、下位 64 ビットにカウ
ンタの値を入れる、といった実装になるのでは。つまり、ブロック
長よりは、カウンタのビット長は、nonce の分だけ短くなると。

nonce 64 ビットと カウンタ 64 ではなくて、nonce 96 ビットに
カウンタ 32 ビットでもよいのでしょう。

> ブロック長より長く取ろうと思ったら、
> インクリメントではだめです。1周した後同じ入力になっちゃうし。

カウンタは、インクリメントでやっています。カウンタは1周した
ら終りですけれど、今の場合、ファイルを暗号化したいので、バイ
ト数の上限が決まっているので、大丈夫です。最大ファイル長が、
64 ビットもあれば、しばらく十分です。

Yoshitaka Ikeda

unread,
Jan 23, 2008, 5:05:19 AM1/23/08
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 新城@筑波大学情報です。こんにちは。
>
> In article <86odbe8...@bsd2.4bn.ne.jp>
> Yoshitaka Ikeda <ik...@4bn.ne.jp> writes:
>> > CTR の nonce やカウンタのビット長はどうやって指定するんだろう。
>> CTRのカウンタは多分ブロック長と同じです。
>
> CTR モードの場合、たとえば、128 ビットのブロックを暗号化する
> なら、上位、64 ビットに noce を入れて、下位 64 ビットにカウ
> ンタの値を入れる、といった実装になるのでは。つまり、ブロック
> 長よりは、カウンタのビット長は、nonce の分だけ短くなると。
>
> nonce 64 ビットと カウンタ 64 ではなくて、nonce 96 ビットに
> カウンタ 32 ビットでもよいのでしょう。

あ~、nonceは初期値に使われるけど、初期値自体は公開値なので
(かぶらなければ)適当にやってもいいのだと思います。

かぶらないようにしようと思ったら、できるだけ長いほうがいいでしょう。
バースデイパラドックスが効いてきちゃいますので。

#同じ初期値やちかい初期値だと二つの平文の排他的論理和が暴露されて
しまいます。

>> ブロック長より長く取ろうと思ったら、
>> インクリメントではだめです。1周した後同じ入力になっちゃうし。
>
> カウンタは、インクリメントでやっています。カウンタは1周した
> ら終りですけれど、今の場合、ファイルを暗号化したいので、バイ
> ト数の上限が決まっているので、大丈夫です。最大ファイル長が、
> 64 ビットもあれば、しばらく十分です。

その用途なら十分ですね。

Yasushi Shinjo

unread,
Jan 24, 2008, 12:53:08 AM1/24/08
to
新城@筑波大学情報です。こんにちは。

In article <86odbe8...@bsd2.4bn.ne.jp>
Yoshitaka Ikeda <ik...@4bn.ne.jp> writes:
> OFBとは全く違います。OFBはどちらかというとフィードバックシフトレジスタの
> フィードバック関数がブロック暗号になったというイメージのほうが正しいです。

私も CTR (Counter) モードはフィードバックがないので、関数的
なイメージだったのですが、世の中では、Output Feedback Mode
(OFB) モードの改良という考え方があるようです。結城さんの暗号
の本[1]を開いたらちょうど出てました。今までは同じページを見
ても気が付かなかったんだけれど。

[1] 結城浩: "暗号技術入門 秘密の国のアリス",ソフトバンククリ
エイティブ (2003/9/30). ISBN-10: 4797322977, ISBN-13:
978-4797322972.

------------------------------------------------------------
OFBモード
[平文ブロック]
+-------------+ |
| | v
+--> [暗号化] +--> XOR
|
v
[暗号文ブロック]

CTRモード
[平文ブロック]
+---------------+ |
| | v
+--> [カウンタ] +--> [暗号化] --> XOR
|
v
[暗号文ブロック]
------------------------------------------------------------

インクリメントの x = x + 1 で、フィードバックとか。私は、あ
んまりそんな感じはしません。関数的な感じ。

[暗号文ブロック] = f([鍵],append(nonce,カウンタ値),[平文ブロック])

> CTRは、出力とは全く関係ないカウンタが逐次変わっていきます。
> 一般にはインクリメントが実装されることが多いです。ランダムアクセスが楽だし。

カウンタ・モードで、インクリメント以外の実装もあるんですね。

> > http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/StandardNames.html
> > http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/crypto/CryptoSpec.html
> 訳がわるいのか原文がわるいのか。暗号のことを知らない人が書いた文章にしかみえない。
> initメソッドで設定できるように読めるけど、どれを使えばいいのかわかんないし。

原書はこれ。/ja を取ればでてきます。2つ。

http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html
http://java.sun.com/javase/6/docs/technotes/guides/security/StandardNames.html

------------------------------------------------------------
CTR A simplification of OFB, Counter mode updates the input
block as a counter.
------------------------------------------------------------

0 new messages