HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0827
Okay暗号化について6未解決


Okay

リンク

2015/8/27(Thu) 20:49:22|NO.71081

今作っているソフトで rc4encode を使って暗号化するのですが、文章が長くなると、
暗号化された文章が途中で切れてしまっています。 rc4encode には最大文字数があるのでしょうか?
また、そうであれば、解決法も教えてください。
これがうまくいきません↓

#include "hspinet.as"
#include "user32.as"


font "メイリオ",12
pos 45,0
mes "タイトル"
pos 290,0
mes "パスワード"
pos 480,0
mes "確認入力"
sdim ttle,50
pos 105,0:input ttle,150,20,50
sdim pkey1,20
pos 360,0:input pkey1,100,20,20
sdim pkey2,20
pos 539,0:input pkey2,100,20,20
sdim pt,20000
pos 40,21:mesbox pt,599,350,1,0:obj0=stat
sdim status,5000
pos 40,372:mesbox status,599,87,0,0:obj1=stat
color 205,206,205
line 38,480,38,0
color 245,246,248
boxf 0,0,37,480
pos 0,0
objsize 38,38
button gosub "ENC",*enc

stop

*enc
if pkey1=pkey2:key=pkey1
sdim enct,20000
enct=pt
rc4encode enct,key
rc4encode enct,key
objprm obj0,"暗号化されたファイル:\n"+enct
stop

お願いいたします。



この記事に返信する


volatile

リンク

2015/8/28(Fri) 00:32:00|NO.71083

rc4encodeのヘルプには

p3を省略またはマイナス値とした場合には、変数バッファの内容を
文字列として自動的にサイズを決定します。

とあるので、第3引数にenctのサイズを指定してみては?



Velgail

リンク

2015/8/28(Fri) 00:47:24|NO.71084


p3でバッファサイズを指定します。p3を省略またはマイナス値とした場合には、 変数バッファの内容を文字列として自動的にサイズを決定します。
----rc4encodeより

自動的にサイズを決定するとはどういうことなのか?
内部状態がそこまでわからないので推定だが、


1バイトにつき1文字のコードが連続して置かれている。 文字列の一番最後は、終わりを示すコードとして0が置かれている。
----HDL内 HSP3 文字列のひみつ(TIPS)より

という「文字列の終わり=0」が最初に現れる場所を検出しているのではないだろうか?
(なお、これはstrlenの挙動と一緒)
試しにパスワードを変えてみると良い。復号できる長さが異なるはずである。

つまり、この状態を何とかするには、p3に適切な値を設定すれば良いはずである。
ヒントはここまで。頑張ってみてください。



Velgail

リンク

2015/8/28(Fri) 00:51:40|NO.71085

……読みなおして気付く。
文字列型として長さを自動判別→どう見てもstrlen(p1)の値です本当に(ry

>>volatileさん
enctのサイズを指定って20000のことかstrlen(enct)のことか。
20000でやったらどんな長さの文でも20000Byte使ってしまうポンコツになるし、
strlen(enct)だと工夫が必要。
rc4encode enct,key,strlen(enct); はアウト。結局変わってないからね。



volatile

リンク

2015/8/28(Fri) 01:28:37|NO.71087

そんなメモリをケチケチするような時代じゃないので、安直に20000でいいと思います。
が、HELP曰く、

RC4暗号では、暗号化する前と後でデータサイズに変更はありません。

故に、strlen(pt)を指定するのが正解かも。



Velgail

リンク

2015/8/28(Fri) 01:30:06|NO.71088

最大2GBのファイルまで扱えます

という用途に使う場合
「いつでも2GB使ってしまう」ソフトは問題ですよ。今でも。

ケチとかではなく、パフォーマンスにもろに影響するので

--(ある意味Computer Science脳)



skyblue

リンク

2015/8/28(Fri) 12:53:33|NO.71091

暗号化したいデータのサイズを知っているはずなので
そのサイズを第三引数に指定すれば大丈夫です。
表示可能ASCII文字列のみの場合はstrlenで大丈夫です。
それ以外はstrlenは使えませんし変数のサイズを使用しては無駄が大きすぎるのでだめです。

なぜstrlenが使えないかと言うと
ハードウェアに近いソフトウェアの仕様です。

CPUは文字列終端なんて気にしません。
なのでOSや言語、ソフトで文字列終端を決めているのです。
ASCII以外は表示可能ASCII文字が存在します。
実装上ASCII文字列の文字数を調べる関数です。
C++のString型とかは内部的にサイズを持っています。



ONION software Copyright 1997-2023(c) All rights reserved.