C++ 持久字节输出计数器C++;
我正在做一个项目,在这个项目中,我需要跟踪软件输出的字节数C++ 持久字节输出计数器C++;,c++,encryption,base64,C++,Encryption,Base64,我正在做一个项目,在这个项目中,我需要跟踪软件输出的字节数 软件会偶尔打开或关闭,因此我必须实现一种存储输出字节数的方法,以使管理员或其他用户无法简单地打开文件并更改输出字节数。 实现这一点的最佳方式是什么 另外,我不能使用任何库(例如:boost)。这里是一个使用 #包括 #包括 无效加密(uint32\u t*v、uint32\u t*k){ uint32_t v0=v[0],v1=v[1],总和=0,i;/*设置*/ uint32_t delta=0x9e3779b9;/*一个键调度常量*
软件会偶尔打开或关闭,因此我必须实现一种存储输出字节数的方法,以使管理员或其他用户无法简单地打开文件并更改输出字节数。
实现这一点的最佳方式是什么
另外,我不能使用任何库(例如:boost)。这里是一个使用
#包括
#包括
无效加密(uint32\u t*v、uint32\u t*k){
uint32_t v0=v[0],v1=v[1],总和=0,i;/*设置*/
uint32_t delta=0x9e3779b9;/*一个键调度常量*/
uint32_t k0=k[0],k1=k[1],k2=k[2],k3=k[3];/*缓存密钥*/
对于(i=0;i<32;i++){/*基本循环开始*/
总和+=增量;
v0+=((v1>5)+k1);
v1+=((v0>5)+k3);
}/*结束周期*/
v[0]=v0;v[1]=v1;
}
无效解密(uint32_t*v,uint32_t*k){
uint32_t v0=v[0],v1=v[1],总和=0xC6EF3720,i;/*设置*/
uint32_t delta=0x9e3779b9;/*一个键调度常量*/
uint32_t k0=k[0],k1=k[1],k2=k[2],k3=k[3];/*缓存密钥*/
对于(i=0;i5)+k3);
v0-=((v1>5)+k1);
总和-=增量;
}/*结束周期*/
v[0]=v0;v[1]=v1;
}
int main()
{
uint32_t k[4]={123456789,10};//键
uint32_t v[2]={1000000,1000000};//数据
//保存到文件中
ofs流的std::of(“save.dat”,std::ios::binary);
加密(v,k);
ofs v2[1])
{
std::cout下面是一个使用
#包括
#包括
无效加密(uint32\u t*v、uint32\u t*k){
uint32_t v0=v[0],v1=v[1],总和=0,i;/*设置*/
uint32_t delta=0x9e3779b9;/*一个键调度常量*/
uint32_t k0=k[0],k1=k[1],k2=k[2],k3=k[3];/*缓存密钥*/
对于(i=0;i<32;i++){/*基本循环开始*/
总和+=增量;
v0+=((v1>5)+k1);
v1+=((v0>5)+k3);
}/*结束周期*/
v[0]=v0;v[1]=v1;
}
无效解密(uint32_t*v,uint32_t*k){
uint32_t v0=v[0],v1=v[1],总和=0xC6EF3720,i;/*设置*/
uint32_t delta=0x9e3779b9;/*一个键调度常量*/
uint32_t k0=k[0],k1=k[1],k2=k[2],k3=k[3];/*缓存密钥*/
对于(i=0;i5)+k3);
v0-=((v1>5)+k1);
总和-=增量;
}/*结束周期*/
v[0]=v0;v[1]=v1;
}
int main()
{
uint32_t k[4]={123456789,10};//键
uint32_t v[2]={1000000,1000000};//数据
//保存到文件中
ofs流的std::of(“save.dat”,std::ios::binary);
加密(v,k);
ofs v2[1])
{
std::请给我们一个更好的“软件发出的字节数”定义。您想登录stdout?还是跟踪分配/解除分配?…管理员或…“根据定义,本地管理员是上帝,这是不可能的。您需要将数据发送到您(或可信代表)使用的远程计算机拥有完全的控制权。有几十种实现持久性的方法:文件、数据库、本地服务器、云服务器等。选择一种,编写一个程序,然后我们会为您提供一些帮助。您想让某人改变/删除计数有多难?不可能是不可能的。这看起来很简单,刚刚测试过,可以正常工作很好。您可能需要在这里使用两个不同的密钥对您的值进行加密,并将两个结果存储在文件中,然后如果在描述时修改了值,则这些值将不匹配。请为我们提供“软件输出的字节”的更好定义。您想记录stdout吗?还是跟踪分配/解除分配?“…管理员或…”根据定义,本地管理员不可能是上帝。您需要将数据发送到您(或受信任的代表)使用的远程计算机拥有完全的控制权。有几十种实现持久性的方法:文件、数据库、本地服务器、云服务器等。选择一种,编写一个程序,然后我们会为您提供一些帮助。您想让某人改变/删除计数有多难?不可能是不可能的。这看起来很简单,刚刚测试过,可以正常工作很好。您可能需要在这里使用两个不同的密钥加密您的值,并将这两个结果存储在文件中,然后,如果修改,则在描述时,这些值将不匹配
#include <iostream>
#include <fstream>
void encrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0, i; /* set up */
uint32_t delta = 0x9e3779b9; /* a key schedule constant */
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* cache key */
for (i = 0; i < 32; i++) { /* basic cycle start */
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
} /* end cycle */
v[0] = v0; v[1] = v1;
}
void decrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i; /* set up */
uint32_t delta = 0x9e3779b9; /* a key schedule constant */
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* cache key */
for (i = 0; i<32; i++) { /* basic cycle start */
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
} /* end cycle */
v[0] = v0; v[1] = v1;
}
int main()
{
uint32_t k[4] = { 123,456,789,10 }; // key
uint32_t v[2] = { 1000000, 1000000 }; // data
// save into file
std::ofstream ofs("save.dat", std::ios::binary);
encrypt(v, k);
ofs << v[0] << " " << v[1] << std::endl;
// read from file
std::ifstream ifs("save.dat", std::ios::binary);
uint32_t v2[2];
if (ifs >> v2[0] >> v2[1])
{
std::cout << "Filedata: " << v2[0] << " " << v2[1] << std::endl;
decrypt(v2, k);
if (v2[0] == v2[1])
std::cout << "Decrypted: " << v2[0] << std::endl;
else
std::cout << "Data was tampered with!" << std::endl;
}
}