QRコード
QRCODE
アクセスカウンタ
読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 0人
オーナーへメッセージ
slMame › 一日一膳腹八分目 › 忘れない為に。。 › lsl 乱数生成器
2010年02月04日

lsl 乱数生成器

簡単な暗号通信をしたいと思い立ち、計算が軽い物を。。。
乱数に関しましては、北国ぺんぎん様のブログにもっと長周期(現在最強?)のものが紹介されております。

鍵になる文字列からハッシュを生成し、それを元にxorShift32乱数で4つのSeedを生成し、そのSeedを元にxorShift128乱数を生成します。
受信側と送信側のSeedが同期している限り復号し、同期が取れなくなると復号できなくなります。




// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)
integer x = 123456789;
integer y = 362436069;
integer z = 521288629;
integer w = 88675123;
 
//***************************************************
//暗号化
//***************************************************
string alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/*-+.!\"#$%&'()~^|@{}[]*;?/_";
string encode(string txt)
{
integer n=llStringLength(txt);
string s="";
while(n--)
{
integer v=llRound(xorShift128(1.0)*(llStringLength(alphabet)-1));
s=llGetSubString(alphabet,v,v)+s;
}
return llXorBase64StringsCorrect(llStringToBase64(txt),llStringToBase64(s));
}
//***************************************************
//復号
//***************************************************
string decode(string crypt)
{
integer n=llStringLength(llBase64ToString(crypt));
string s="";
while(n--)
{
integer v=llRound(xorShift128(1.0)*(llStringLength(alphabet)-1));
s=llGetSubString(alphabet,v,v)+s;
}
return llBase64ToString(llXorBase64StringsCorrect(crypt,llStringToBase64(s)));
}
 
 
//論理右シフト
integer shrl(integer i,integer j)
{
return ((i >> j) & (0x7fffffff >> j-1));
}
//RSハッシュ
integer rsHash(string str)
{
integer len=llStringLength(str);
integer b = 378551;
integer a = 63689;
integer hash = 0;
while(str!="")
{
if (str!="")
{
while (llStringLength(str)<4)
{
str=str+" ";
}
}
string s1=llGetSubString(str,0,3);
str=llGetSubString(str,4,len);
integer i=llBase64ToInteger(llStringToBase64(s1));
integer k=llStringLength(s1);
while(k--)
{
hash = hash * a + (((i & (0x000000ff << 8*k)) >> 8*k) & 0x000000ff);
a = a * b;
}
}
return hash;
}
//Seed初期化(XorShift32)
randmize(string k)
{
integer y0=rsHash(k);
y0=y0^(y0<<13);
y0=y0^shrl(y0,17);
x=y0^(y0<<5);
y0 =y0^(y0<<13);
y0=y0^shrl(y0,17);
y=y0^(y0<<5);
y0=y0^(y0<<13);
y0= y0^shrl(y0,17);
z=y0^(y0<<5);
y0=y0^(y0<<13);
y0=y0^shrl(y0,17);
w=y0^(y0<<5);
}
//XorShift乱数(周期2^128-1)
float xorShift128(float f)
{
do
{
integer t = x ^ (x << 11);
x = y;
y = z;
z = w;
w =(w ^ shrl(w,19)) ^ (t ^ shrl(t,8));
} while(w==-2147483648);
return ((float)(2147483647-llAbs(w))/2147483646.0*f);
}

default
{
state_entry()
{
randmize("abdcefg");
}
touch_start(integer total_number)
{
integer a=x;
integer b=y;
integer c=z;
integer d=w;
string test="Rocket FM is great!";
llSay(0,test);
string crypt=encode(test);
llSay(0,llBase64ToString(crypt));
x=a;
y=b;
z=c;
w=d;
llSay(0,decode(crypt));
}
}


同じカテゴリー(忘れない為に。。)の記事画像
パーティクル設定項目について
同じカテゴリー(忘れない為に。。)の記事
 他人が座っているプリムの情報取得/REZした物の情報取得 (2016-09-12 05:52)
 llCastRay()実装 (2011-09-21 20:59)
 Visual C# スキャナーから画像を取り込み (2011-01-08 22:56)
 lslのlistで連想配列もどき・・ (2009-08-31 21:30)
 PIの比較で90度と270度を切り分けるには・・ (2009-08-09 17:19)
 LSLコード色づけ~これはすごいですね (2009-08-08 11:52)

Posted by RBK Drachnyd(しお) at 17:51│Comments(0)忘れない為に。。
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。