BYTE(unsigned char)型からint型への変換に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Loki
記事: 22
登録日時: 7年前

BYTE(unsigned char)型からint型への変換に関して

#1

投稿記事 by Loki » 7年前

現在CryptGenRandom関数を使って乱数を得ています。

コード:

#include <Windows.h>
#define CRYPT_GEN_RAND_MAX	UCHAR_MAX	//乱数最大値
int random(int min,int max){
	HCRYPTPROV hProv;
	BYTE buf[1];
	CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0);
	CryptGenRandom(hProv,100,buf);
	return min+(atoi((char*)buf[0])*(max-min+1)/(1+CRYPT_GEN_RAND_MAX));
}
この内の atoi((char*)buf[0]) でBYTE型からint型への変換を試みましたが、駄目でした。
一体どのようにすれば変換できるのでしょうか。
環境:
Microsoft Visual C++ 2010 Express
Windows7

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: BYTE(unsigned char)型からint型への変換に関して

#2

投稿記事 by YuO » 7年前

CryptGenRandomの呼び出しがどう見てもバッファーオーバーランです。

それはともかく,わざわざ暗号学的に安全な乱数を発生しているのですから,そのまま使えばよいのではないでしょうか。
32bitの乱数を発生させて,それをポインタをキャストするなりunion使うなりして,int型として扱えばよいのです。

ただ,本当にそこまで暗号学的に安全な乱数がいるのか,という疑問点はありますが。
この手の乱数は,IVなどでバイト列をそのまま使うことを前提としているので,出てきた値を弄るには向いていない気がします。
# 弄った後に安全性が保てないなら,わざわざこの手の乱数を使う必要がないので。

Loki
記事: 22
登録日時: 7年前

Re: BYTE(unsigned char)型からint型への変換に関して

#3

投稿記事 by Loki » 7年前

ただゲームに使うだけなので、安全でなくともよいのですが、諸事情で使いました。
YuO さんが書きました:そのまま使えばよいのではないでしょうか
こちらの一文より、解決策が見えました!ありがとうございました。

解決後のソース:

コード:

#include <Windows.h>
#define CRYPT_GEN_RAND_MAX	UCHAR_MAX	//乱数最大値
int random(int min,int max){
	HCRYPTPROV hProv;
	BYTE buf[1];
	CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0);
	CryptGenRandom(hProv,1,buf);
	return min+((int)*buf*(max-min+1)/(1+CRYPT_GEN_RAND_MAX));
}

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: BYTE(unsigned char)型からint型への変換に関して

#4

投稿記事 by へにっくす » 7年前

Loki さんが書きました:

コード:

#include <Windows.h>
#define CRYPT_GEN_RAND_MAX  UCHAR_MAX   //乱数最大値
int random(int min,int max){
    HCRYPTPROV hProv;
    BYTE buf[1];
    CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0);
    CryptGenRandom(hProv,1,buf);
    return min+((int)*buf*(max-min+1)/(1+CRYPT_GEN_RAND_MAX));
}
CryptGenRandomに渡すバッファが1バイトは短すぎ。
たぶんどこの例をみても、1バイトにしてるところはないでしょう。なぜならなるべく大きいサイズを指定しなさいとあるからです。
MSDNのサンプルですと8バイトになってますね
CryptGenRandom function
それに1バイトですと、
0~255までのランダムならいいのかもしれませんが、minとmaxの範囲の差が256以上の場合は完全な乱数にならないでしょう。
私だったら4バイトにしてlongに変換するけどなあ。。
written by へにっくす

閉鎖

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