Собственно рабочая версия
int power(int a, int b, int n){// a^b mod n
int tmp=a;
int sum=tmp;
for(int i=1;i<b;i++){
for(int j=1;j<a;j++){
sum+=tmp;
if(sum>=n){
sum-=n;
}
}
tmp=sum;
}
return tmp;
}
int mul(int a, int b, int n){// a*b mod n
int sum=0;
for(int i=0;i<b;i++){
sum+=a;
if(sum>=n){
sum-=n;
}
}
return sum;
}
/*****************************************************
p - простое число
0 < g < p-1
0 < x < p-1
m - шифруемое сообщение m < p
*****************************************************/
void crypt(int p,int g,int x, string inFileName,string outFileName){
ifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
int y=power(g,x,p);
wcout<<"Открытый ключ (p,g,y)="<<"("<<p<<","<<g<<","<<y<<")"<<endl;
wcout<<"Закрытый ключ x="<<x<<endl;
wcout<<"\nШифруемый текст:"<<endl;
while(inf.good()){
int m=inf.get();
if(m>0){
wcout<<(char)m;
int k=rand()%(p-2)+1; // 1 < k < (p-1)
int a= power(g,k,p);
int b= mul(power(y,k,p),m,p);
outf<<a<<" "<<b<<" ";
}
}
wcout<<endl;
inf.close();
outf.close();
}
void decrypt(int p,int x,string inFileName,string outFileName){
ifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
wcout<<"\nДешифрованый текст:"<<endl;
while(inf.good()){
int a=0;
int b=0;
inf>>a;
inf>>b;
if(a!=0&&b!=0){
//wcout<<a<<" "<<b<<endl;
int deM=mul(b,power(a,p-1-x,p),p);// m=b*(a^x)^(-1)mod p =b*a^(p-1-x)mod p - трудно было найти нормальную формулу, в ней вся загвоздка
char m=static_cast<char>(deM);
outf<<m;
wcout<<m;
}
}
wcout<<endl;
inf.close();
outf.close();
}
int main(){
srand(time(NULL));
crypt(593,123,8, "in.txt","out_crypt.txt");
decrypt(593,8,"out_crypt.txt","out_decrypt.txt");
return 0;
}
Описание алгоритма на википедии без волшебной формулы
int power(int a, int b, int n){// a^b mod n
int tmp=a;
int sum=tmp;
for(int i=1;i<b;i++){
for(int j=1;j<a;j++){
sum+=tmp;
if(sum>=n){
sum-=n;
}
}
tmp=sum;
}
return tmp;
}
int mul(int a, int b, int n){// a*b mod n
int sum=0;
for(int i=0;i<b;i++){
sum+=a;
if(sum>=n){
sum-=n;
}
}
return sum;
}
/*****************************************************
p - простое число
0 < g < p-1
0 < x < p-1
m - шифруемое сообщение m < p
*****************************************************/
void crypt(int p,int g,int x, string inFileName,string outFileName){
ifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
int y=power(g,x,p);
wcout<<"Открытый ключ (p,g,y)="<<"("<<p<<","<<g<<","<<y<<")"<<endl;
wcout<<"Закрытый ключ x="<<x<<endl;
wcout<<"\nШифруемый текст:"<<endl;
while(inf.good()){
int m=inf.get();
if(m>0){
wcout<<(char)m;
int k=rand()%(p-2)+1; // 1 < k < (p-1)
int a= power(g,k,p);
int b= mul(power(y,k,p),m,p);
outf<<a<<" "<<b<<" ";
}
}
wcout<<endl;
inf.close();
outf.close();
}
void decrypt(int p,int x,string inFileName,string outFileName){
ifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
wcout<<"\nДешифрованый текст:"<<endl;
while(inf.good()){
int a=0;
int b=0;
inf>>a;
inf>>b;
if(a!=0&&b!=0){
//wcout<<a<<" "<<b<<endl;
int deM=mul(b,power(a,p-1-x,p),p);// m=b*(a^x)^(-1)mod p =b*a^(p-1-x)mod p - трудно было найти нормальную формулу, в ней вся загвоздка
char m=static_cast<char>(deM);
outf<<m;
wcout<<m;
}
}
wcout<<endl;
inf.close();
outf.close();
}
int main(){
srand(time(NULL));
crypt(593,123,8, "in.txt","out_crypt.txt");
decrypt(593,8,"out_crypt.txt","out_decrypt.txt");
return 0;
}
Описание алгоритма на википедии без волшебной формулы
Вся загвоздка в отсутствии генератора g
ОтветитьУдалитьза генерацию этих чисел должен отвечать вызывающий код
Удалитьа можешь на почту архив с прогой скинуть, пожалуйста
ОтветитьУдалитьbaglin-ml@mail.ru
код рабочий, нужно только подключить заголовочные файлы и пространство имен std.
Удалитьсделал все, подключил все библиотеки и пространство имен, а у меня ругается на
Удалитьifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
http://www.cplusplus.com/reference/fstream/ifstream/ifstream/
Удалить// ifstream constructor.
#include // std::cout
#include // std::ifstream
int main () {
std::ifstream ifs ("test.txt", std::ifstream::in);
char c = ifs.get();
while (ifs.good()) {
std::cout << c;
c = ifs.get();
}
ifs.close();
return 0;
}
Как выполнить данный код в Visual C++. Заголовки подключил, проект запустился, но в упор не читает файлы, непонятно в чем проблема.
ОтветитьУдалитьНужны следующие заголовочные файлы стандартной библиотеки std
Удалитьiostream
cstdlib
ctime
а также объявить пространство имен
use namespace std;
Файл in.txt нужно положить в ту же папку где и исполняемый файл, там же должны появиться файлы out_crypt.txt out_decrypt.txt
также еще нужна библиотека string
Удалитьа входные файлы должны содержать только символы ASCII
Здравствуйте, все подключил, ничего не работает, в конце выбивает пустой эран, в файлах ничего нет?
УдалитьА можно кинуть готовый проект пожалуйста, что-то у меня вылетает много ошибок
ОтветитьУдалитьне выводит шифрованный и дешифрованный текст. Файлы out_crypt.txt out_decrypt.txt не появляются
ОтветитьУдалитьФайлы out_crypt.txt out_decrypt.txt появились,но они пустые. Что делать?
ОтветитьУдалитьчтобы программа работала также надо подключить #include
ОтветитьУдалить#include
Удалитьfstream
Удалить#include
ОтветитьУдалить#include
#include
#include
using namespace std;
int power(int a, int b, int n) // a^b mod n
{
int tmp = a;
int sum = tmp;
for (int i = 1; i < b; i++)
{
for (int j = 1; j < a; j++)
{
sum += tmp;
if (sum >= n)
{
sum -= n;
}
}
tmp = sum;
}
return tmp;
}
int mul(int a, int b, int n) // a*b mod n
{
int sum = 0;
for (int i = 0; i < b; i++)
{
sum += a;
if (sum >= n)
{
sum -= n;
}
}
return sum;
}
/*****************************************************
p - простое число
0 < g < p-1
0 < x < p-1
m - шифруемое сообщение m < p
*****************************************************/
void crypt(int p, int g, int x, string inFileName, string outFileName)
{
ifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
int y = power(g, x, p);
cout << "Открытый ключ (p,g,y)=" << "(" << p << "," << g << "," << y << ")" << endl;
cout << "Закрытый ключ x=" << x << endl;
cout << "\nШифруемый текст:" << endl;
while (inf.good())
{
int m = inf.get();
if (m > 0) {
cout << (char)m;
int k = rand() % (p - 2) + 1; // 1 < k < (p-1)
int a = power(g, k, p);
int b = mul(power(y, k, p), m, p);
outf << a << " " << b << " ";
}
}
cout << endl;
inf.close();
outf.close();
}
void decrypt(int p, int x, string inFileName, string outFileName)
{
ifstream inf(inFileName.c_str());
ofstream outf(outFileName.c_str());
cout << "\nДешифрованый текст:" << endl;
while (inf.good())
{
int a = 0;
int b = 0;
inf >> a;
inf >> b;
if (a != 0 && b != 0)
{
int deM = mul(b, power(a, p - 1 - x, p), p);// m=b*(a^x)^(-1)mod p =b*a^(p-1-x)mod p - трудно было найти нормальную формулу, в ней вся загвоздка
char m = static_cast(deM);
outf << m;
cout << m;
}
}
cout << endl;
inf.close();
outf.close();
}
int main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));
crypt(593, 123, 8, "in.txt", "out_crypt.txt");
decrypt(593, 8, "out_crypt.txt", "out_decrypt.txt");
return 0;
}
TOTO MINT TOTO MINT TOTO MINT TOTO
ОтветитьУдалитьTOTO MINT TOTO MINT TOTO MINT TOTO MINT TOTO MINT TOTO TOTO revlon hair dryer brush titanium MINT burnt titanium TOTO smith titanium TOTO MINT TOTO titanium max MINT TOTO titanium wedding ring TOTO TOTO TOTO MINT TOTO TOTO TOTO TOTO MINT TOTO TOTO MINT TOTO TOTO TOTO
address dildo,vibrators,male masturbator,dildos,vibrators,horse dildo,sex chair,sex chair,dildo reference
ОтветитьУдалитьb913h4wwied812 dog dildo,black dildos,sex chair,horse dildo,bulk sex dolls,realistic sex dolls,custom sex doll,wholesale sex toys,realistic dildo p015v3ewimw989
ОтветитьУдалить