ページ 1 / 1
RC4によるデータの暗号化
Posted: 2012年6月21日(木) 12:26
by taityaki
RC4によるデータの暗号化を目的として、以下の関数を作りましたが、これでバイナリデータのの通信データを暗号化すると複合化したら違うデータになりました。普通の時は大丈夫です。今の関数はどのようにおかしいですか?複合化でもとのデータに戻ることを期待します。
void EncByRC4(unsigned char *plain,int plainlen,unsigned char *key,int keylen,unsigned char *encryptdata){
RC4_KEY rc4key;
RC4_set_key(&rc4key, keylen, key);
RC4(&rc4key, plainlen,plain, encryptdata);
}
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 12:45
by softya(ソフト屋)
複合ではなく復号ですね。
RC4 の実装がわからないですが普通の時は大丈夫とはどういう意味でしょうか?
バイナリデータだけでダメな場合は、何処かで文字列扱いしていて0x00がナル文字と判定されて動作が変わることが考えられます。
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 16:24
by taiyaki
復号の漢字が違ってて気づきませんでしたm(_ _)m
テキストデータでもだめです。
「123456789abcde」を暗号化し、「!辞*w・s]フE?xュ」」にして、暗号化して
前10バイトは「!辞*w・s」後ろ5バイトは「マD8y」に分けて復号化したら
前10バイトは「1234567890」後ろ5バイトは「ワf穰」
という感じになって、「1234567890」と「abcdef」に戻らなかったのは、
RC4の仕様ですか。ストリーム暗号なのでデータの区切りは関係ないと思ったのですが。
もしそうなら、送信するときにデータが細切れになるので先頭データ以外が正しく復号されず
壊れるのかとおもいました。回避策はありますか。
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 16:26
by taiyaki
はじめの質問をtaityakiとして書いていたのですが
taiyakiの間違えです、taityakiもtaiyakiも僕です
ごめんなさい
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 16:39
by 沖 滉均
RC4の仕様はよくは知りませんが、前10byteと後ろ5byteを別々に復号化しようとしているからなのではないでしょうか?
全てを受信後(で良いのかな?)、結合して復号してやる必要があるのではないでしょうか
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 16:39
by h2so5
ストリーム暗号というのは平文の長さが指定バイトの倍数である必要がないというだけであって、
暗号文を任意の長さに分割しても復号できるわけではありません。
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 16:46
by taiyaki
お二方ありがとうございます
勝手に分割したらダメなんですね。送信し終わってから暗号化しようと思います
softyaさんもありがとうございます
Re: RC4によるデータの暗号化
Posted: 2012年6月21日(木) 18:04
by h2so5
補足ですが、分割されていてもストリームが続いていれば復号はできます。
途中でRC4_set_keyを呼んでしまうと状態がリセットされるのでだめですが、
リセットせずに同じKeyで RC4関数 を続けて呼べば分割されている暗号文を復号できます。