投稿のタイトルが示すように、今回はVigenere Cipherを作成することで、C++と文字操作の理解を深めるために取り組んでいます。慣れていない人にとっては、テキストファイルを暗号化するのはかなり簡単な方法です。
それが機能する基本的な方法は、文字列「キー」が存在し、各文字(少なくとも私の場合)は小文字のアルファベット文字であるということです。これらは配列に格納され、エンコードされるファイルの値を「シフト」するために使用されます。「a」の文字はターゲットを0だけシフトし、「z」はターゲットを25だけシフトします。「シフト」は循環的です。つまり、「z」を「b」(1)だけシフトすると、 'a'。
私の現在の方法は以下のとおりです。
//Assume cipher[] contains "[a][b][c][x ][y ][z ]" Cipher is a <string> object
//Assume ptr[] contains "[0][1][2][23][24][25]
#A whole bunch of includes
char c;
ifstream is;
ofstream os;
is.open(argv[3]) //"myinput.txt"
os.open(argv[4]) //"myoutput.txt"
int i = 0;
while( is.good() ) {
c = is.get();
if( is.good() ) { //did we just hit the EoF?
c = tolower( c - 0 ); //just make sure it's lowercase
c = c + ptr[ i % cipher.size() ] % 26;
if( c> 122 )
c = ( c % 123 ) + 97;
i++;
os.put( c );
}
}
私の問題はモジュロ演算にあると私は信じています。これをハッシュ化するのに多くの時間を費やしたためかもしれませんが、昨夜これを書くのに何時間も費やし、次にベッドに横になって、自分が欲しいものを効果的に作成する方法に頭を悩ませようとしました。
grab char.
check char. //let char = 'z'
check the cipher. //let the cipher = 'y'
eval cipher shift //'y' shift value = 24
shift z 24 places (cyclically) //'z'==25, 25+24=49, 49%26=23. 23='x'
ここに問題があります:ACSIIでこれを行う方法は?('a' = 97、z = '121')