乱数の解読
Posted: 2017年4月11日(火) 15:44
乱数生成クラスを作ってみました。
これを利用し種のもとをパスワードとしてファイル暗号化プログラムを作ろうと思います。
パスワードを知らない人がファイルを復元する場合この乱数の規則性を調べるのだろうと思いますが
解読される危険性はどの程度あるのでしょうか?
一般に公開されている様な有名な暗号化ソフトと比べてどの程度の差があるのか興味があります。
環境:
windows 10 home
visual studio comunity 2015
理解度:
c, c++入門書が何とか理解できる程度。ネットに転がっているコードを見ても全く理解できません。
これを利用し種のもとをパスワードとしてファイル暗号化プログラムを作ろうと思います。
パスワードを知らない人がファイルを復元する場合この乱数の規則性を調べるのだろうと思いますが
解読される危険性はどの程度あるのでしょうか?
一般に公開されている様な有名な暗号化ソフトと比べてどの程度の差があるのか興味があります。
環境:
windows 10 home
visual studio comunity 2015
理解度:
c, c++入門書が何とか理解できる程度。ネットに転がっているコードを見ても全く理解できません。
//****************** ファイル Random.h *********************************
#pragma once
#include<vector>
class StdRand { // c言語のランダム関数と同様の働きをします。
int x;
public:
StdRand(int n); // 引数に種を指定します。
void setSeed(int n); // 種を設定します。
int get(); // 0 ~ 0x7FFF の乱数を返します。
};
/*
種を文字列から作成する乱数作成クラスを作成します。
文字列のわずかな違いにより全く異なる種を作るために
slide_to_left、str_to_randを使って配列を作成します。
*/
class BeterRand {
std::vector<StdRand> mArray;
int mIndex;
public:
// 文字列を種として乱数配列を作成します
BeterRand(const char *str);
// char単位で左向きに1個分スライドします
static void slide_to_left(char *str);
// 文字列から乱数を作成します
static int str_to_rand(const char *str);
// 0 ~ 0x7FFF の乱数を出力します
int get();
// 0 ~ 0xFF の乱数を出力します
int get_byte();
};
//****************** ファイル Random.h end *******************************
//****************** ファイル Random.cpp *********************************
#include<iostream>
#include<vector>
#include"Random.h"
using namespace std;
StdRand::StdRand(int n)
{
x = n;
}
void StdRand::setSeed(int n)
{
x = n;
}
int StdRand::get()
{
x = 214013 * x + 2531011;
return (x >> 16) & 0x7FFF;
}
BeterRand::BeterRand(const char *str)
{
int length = strlen(str);
char *newP = new char[length + 1];
strcpy_s(newP, length + 1, str);
for (int i = 0; i < length; i++) {
mArray.push_back(str_to_rand(newP));
slide_to_left(newP);
}
delete[]newP;
mIndex = 0;
}
void BeterRand::slide_to_left(char *str)
{
int length = strlen(str);
char top_ch = *str;
memmove(str, str + 1, length - 1);
str[length - 1] = top_ch;
}
int BeterRand::str_to_rand(const char *str)
{
if (!str) return 0;
else if (!*str) return 0;
StdRand rnd(*str);
for (const char *p = str + 1; *p; p++) {
rnd.setSeed(rnd.get() * 0x100 + *(unsigned char *)p);
}
return rnd.get();
}
int BeterRand::get()
{
if (mArray.empty()) return 0;
mIndex = mArray[mIndex].get() * mArray.size() / 0x8000;
return mArray[mIndex].get();
}
int BeterRand::get_byte()
{
return get() / 0x80;
}
//****************** ファイル Random.cpp end ******************************