RC4によるデータの暗号化

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taityaki

RC4によるデータの暗号化

#1

投稿記事 by taityaki » 13年前

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);

}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: RC4によるデータの暗号化

#2

投稿記事 by softya(ソフト屋) » 13年前

複合ではなく復号ですね。
RC4 の実装がわからないですが普通の時は大丈夫とはどういう意味でしょうか?
バイナリデータだけでダメな場合は、何処かで文字列扱いしていて0x00がナル文字と判定されて動作が変わることが考えられます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

taiyaki

Re: RC4によるデータの暗号化

#3

投稿記事 by taiyaki » 13年前

復号の漢字が違ってて気づきませんでしたm(_ _)m
テキストデータでもだめです。
「123456789abcde」を暗号化し、「!辞*w・s]フE?xュ」」にして、暗号化して
前10バイトは「!辞*w・s」後ろ5バイトは「マD8y」に分けて復号化したら
前10バイトは「1234567890」後ろ5バイトは「ワf穰」
という感じになって、「1234567890」と「abcdef」に戻らなかったのは、
RC4の仕様ですか。ストリーム暗号なのでデータの区切りは関係ないと思ったのですが。
もしそうなら、送信するときにデータが細切れになるので先頭データ以外が正しく復号されず
壊れるのかとおもいました。回避策はありますか。

taiyaki

Re: RC4によるデータの暗号化

#4

投稿記事 by taiyaki » 13年前

はじめの質問をtaityakiとして書いていたのですが
taiyakiの間違えです、taityakiもtaiyakiも僕です
ごめんなさい

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: RC4によるデータの暗号化

#5

投稿記事 by 沖 滉均 » 13年前

RC4の仕様はよくは知りませんが、前10byteと後ろ5byteを別々に復号化しようとしているからなのではないでしょうか?
全てを受信後(で良いのかな?)、結合して復号してやる必要があるのではないでしょうか
There is no royal road to learning.
codeタグで指定できる言語
画像

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: RC4によるデータの暗号化

#6

投稿記事 by h2so5 » 13年前

ストリーム暗号というのは平文の長さが指定バイトの倍数である必要がないというだけであって、
暗号文を任意の長さに分割しても復号できるわけではありません。

taiyaki

Re: RC4によるデータの暗号化

#7

投稿記事 by taiyaki » 13年前

お二方ありがとうございます
勝手に分割したらダメなんですね。送信し終わってから暗号化しようと思います
softyaさんもありがとうございます

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: RC4によるデータの暗号化

#8

投稿記事 by h2so5 » 13年前

補足ですが、分割されていてもストリームが続いていれば復号はできます。

途中でRC4_set_keyを呼んでしまうと状態がリセットされるのでだめですが、
リセットせずに同じKeyで RC4関数 を続けて呼べば分割されている暗号文を復号できます。

閉鎖

“C言語何でも質問掲示板” へ戻る