« 暗号技術の研究 | トップページ | 多倍長整数 の処理考察 »

2011/12/22

DES暗号高速化の検討

DES暗号のもっとも処理速度のネックになる、IP()及び、その逆関数FP()について、高速化を検討してみた。

IPについて。

以下は、流れのフロー。
Ip_2

C言語のコードにすると、こんな感じ。


//==============================================================
// Initial Premutation (IP)
//--------------------------------------------------------------
// ●引数
// unsigned __int64 data Input
// ●返値
// unsigned __int64 Output
//==============================================================
unsigned __int64 DES::IP(unsigned __int64 data)
{
unsigned __int64 temp;
unsigned int temp_l,temp_r;
unsigned int l, r;

const unsigned int iMaskL = 0x40100401;
const unsigned int iMaskR = 0x80200802;

//L, R 逆転
temp = ( data & 0xFF) << 32; //最上位
temp |= ((data>> 8) & 0xFF);
temp |= ((data>>16) & 0xFF) << 40;
temp |= ((data>>24) & 0xFF) << 8;
temp |= ((data>>32) & 0xFF) << 48;
temp |= ((data>>40) & 0xFF) << 16;
temp |= ((data>>48) & 0xFF) << 56;
temp |= ((data>>56) & 0xFF) << 24;

r = (unsigned int)(temp>>32);
temp_l = (r & iMaskL);
r = (unsigned int)(temp & 0xFFFFFFFF);
temp_r = (r & iMaskR);

temp_l |= (r & iMaskL) << 1;
r = ((unsigned int)(temp>>32) >> 8 );
l = ((unsigned int)(temp>>32) << (32- 8));
temp_r |= (r & iMaskR) << 1;
temp_r |= (l & iMaskR) >> 7;

temp_l |= (r & iMaskL) << 2;
temp_l |= (l & iMaskL) >> 6;
r = ((unsigned int)(temp & 0xFFFFFFFF) >> 8 );
l = ((unsigned int)(temp & 0xFFFFFFFF) << (32- 8));
temp_r |= (r & iMaskR) << 2;
temp_r |= (l & iMaskR) >> 6;

temp_l |= (r & iMaskL) << 3;
temp_l |= (l & iMaskL) >> 5;
r = ((unsigned int)(temp>>32) >> 16 );
l = ((unsigned int)(temp>>32) << (32-16));
temp_r |= (r & iMaskR) << 3;
temp_r |= (l & iMaskR) >> 5;

temp_l |= (r & iMaskL) << 4;
temp_l |= (l & iMaskL) >> 4;
r = ((unsigned int)(temp & 0xFFFFFFFF) >> 16 );
l = ((unsigned int)(temp & 0xFFFFFFFF) << (32-16));
temp_r |= (r & iMaskR) << 4;
temp_r |= (l & iMaskR) >> 4;

temp_l |= (r & iMaskL) << 5;
temp_l |= (l & iMaskL) >> 3;
r = ((unsigned int)(temp>>32) >> 24 );
l = ((unsigned int)(temp>>32) << (32-24));
temp_r |= (r & iMaskR) << 5;
temp_r |= (l & iMaskR) >> 3;

temp_l |= (r & iMaskL) << 6;
temp_l |= (l & iMaskL) >> 2;
r = ((unsigned int)(temp & 0xFFFFFFFF) >> 24 );
l = ((unsigned int)(temp & 0xFFFFFFFF) << (32-24));
temp_r |= (r & iMaskR) << 6;
temp_r |= (l & iMaskR) >> 2;

temp_l |= (r & iMaskL) << 7;
temp_l |= (l & iMaskL) >> 1;
l = (unsigned int)(temp>>32);
temp_r |= (l & iMaskR) >> 1;

temp = temp_l;
temp <<=32;
temp |= temp_r;

return(temp);
}

・FPについて。
これは、IPの逆関数。
こんな流れで処理する。

Ip1

C言語のコードにすると、こんな感じ。


//==============================================================
//			Inverse Initial Premutation (IP-1)
//--------------------------------------------------------------
//	●引数
//		unsigned	__int64	data	Input
//	●返値
//		unsigned	__int64			Output
//==============================================================
unsigned	__int64	DES::invIP(unsigned	__int64	data)
{
	unsigned	__int64	temp;

unsigned __int64 temp0;
unsigned __int64 temp1;
unsigned __int64 temp2;
unsigned __int64 temp3;
unsigned __int64 temp4;
unsigned __int64 temp5;
unsigned __int64 temp6;
unsigned __int64 temp7;

const unsigned __int64 iMask = 0x8040201008040201;

//L, R 逆転
temp = ( data & 0xFF); //最上位
temp |= ((data>> 8) & 0xFF) << 16;
temp |= ((data>>16) & 0xFF) << 32;
temp |= ((data>>24) & 0xFF) << 48;

temp |= ((data>>32) & 0xFF) << 8;
temp |= ((data>>40) & 0xFF) << 24;
temp |= ((data>>48) & 0xFF) << 40;
temp |= ((data>>56) & 0xFF) << 56;

temp0 = ( temp ) & iMask;

temp1 = ((temp >> 8 ) & iMask) << 1;
temp1 |= ((temp << (64- 8) ) & iMask) >> 7;

temp2 = ((temp >> 16 ) & iMask) << 2;
temp2 |= ((temp << (64-16) ) & iMask) >> 6;

temp3 = ((temp >> 24 ) & iMask) << 3;
temp3 |= ((temp << (64-24) ) & iMask) >> 5;

temp4 = ((temp >> 32 ) & iMask) << 4;
temp4 |= ((temp << (64-32) ) & iMask) >> 4;

temp5 = ((temp >> 40 ) & iMask) << 5;
temp5 |= ((temp << (64-40) ) & iMask) >> 3;

temp6 = ((temp >> 48 ) & iMask) << 6;
temp6 |= ((temp << (64-48) ) & iMask) >> 2;

temp7 = ((temp >> 56 ) & iMask) << 7;
temp7 |= ((temp << (64-56) ) & iMask) >> 1;

return(temp0 | temp1 | temp2 | temp3 | temp4 | temp5 | temp6 | temp7);

}


しかし、このcocologは・・・
"pre"タグを書いても、その中もhtmlタグを自動でいれちゃうのは、どうにかならんのか・・・。
preタグの中でも、改行を二回すると、"p"タグをいれちゃうし。
ソースコードを書くときには、「テキストの挿入」が欲しい。

|

« 暗号技術の研究 | トップページ | 多倍長整数 の処理考察 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/36969/53541985

この記事へのトラックバック一覧です: DES暗号高速化の検討:

« 暗号技術の研究 | トップページ | 多倍長整数 の処理考察 »