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);
}
RC4によるデータの暗号化
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: RC4によるデータの暗号化
複合ではなく復号ですね。
RC4 の実装がわからないですが普通の時は大丈夫とはどういう意味でしょうか?
バイナリデータだけでダメな場合は、何処かで文字列扱いしていて0x00がナル文字と判定されて動作が変わることが考えられます。
RC4 の実装がわからないですが普通の時は大丈夫とはどういう意味でしょうか?
バイナリデータだけでダメな場合は、何処かで文字列扱いしていて0x00がナル文字と判定されて動作が変わることが考えられます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: RC4によるデータの暗号化
復号の漢字が違ってて気づきませんでしたm(_ _)m
テキストデータでもだめです。
「123456789abcde」を暗号化し、「!辞*w・s]フE?xュ」」にして、暗号化して
前10バイトは「!辞*w・s」後ろ5バイトは「マD8y」に分けて復号化したら
前10バイトは「1234567890」後ろ5バイトは「ワf穰」
という感じになって、「1234567890」と「abcdef」に戻らなかったのは、
RC4の仕様ですか。ストリーム暗号なのでデータの区切りは関係ないと思ったのですが。
もしそうなら、送信するときにデータが細切れになるので先頭データ以外が正しく復号されず
壊れるのかとおもいました。回避策はありますか。
テキストデータでもだめです。
「123456789abcde」を暗号化し、「!辞*w・s]フE?xュ」」にして、暗号化して
前10バイトは「!辞*w・s」後ろ5バイトは「マD8y」に分けて復号化したら
前10バイトは「1234567890」後ろ5バイトは「ワf穰」
という感じになって、「1234567890」と「abcdef」に戻らなかったのは、
RC4の仕様ですか。ストリーム暗号なのでデータの区切りは関係ないと思ったのですが。
もしそうなら、送信するときにデータが細切れになるので先頭データ以外が正しく復号されず
壊れるのかとおもいました。回避策はありますか。
Re: RC4によるデータの暗号化
はじめの質問をtaityakiとして書いていたのですが
taiyakiの間違えです、taityakiもtaiyakiも僕です
ごめんなさい
taiyakiの間違えです、taityakiもtaiyakiも僕です
ごめんなさい
Re: RC4によるデータの暗号化
RC4の仕様はよくは知りませんが、前10byteと後ろ5byteを別々に復号化しようとしているからなのではないでしょうか?
全てを受信後(で良いのかな?)、結合して復号してやる必要があるのではないでしょうか
全てを受信後(で良いのかな?)、結合して復号してやる必要があるのではないでしょうか
Re: RC4によるデータの暗号化
ストリーム暗号というのは平文の長さが指定バイトの倍数である必要がないというだけであって、
暗号文を任意の長さに分割しても復号できるわけではありません。
暗号文を任意の長さに分割しても復号できるわけではありません。
Re: RC4によるデータの暗号化
お二方ありがとうございます
勝手に分割したらダメなんですね。送信し終わってから暗号化しようと思います
softyaさんもありがとうございます
勝手に分割したらダメなんですね。送信し終わってから暗号化しようと思います
softyaさんもありがとうございます
Re: RC4によるデータの暗号化
補足ですが、分割されていてもストリームが続いていれば復号はできます。
途中でRC4_set_keyを呼んでしまうと状態がリセットされるのでだめですが、
リセットせずに同じKeyで RC4関数 を続けて呼べば分割されている暗号文を復号できます。
途中でRC4_set_keyを呼んでしまうと状態がリセットされるのでだめですが、
リセットせずに同じKeyで RC4関数 を続けて呼べば分割されている暗号文を復号できます。