【发布时间】:2018-08-09 15:47:09
【问题描述】:
我正在尝试构建一个程序来加密密码,然后执行相反的过程(从加密的密码中告诉正确的密码)。
为此,我有:
密码(
char[]类型);与密码的
char长度相同的加密密钥(vector -int[]类型);两步(也放在
int step[2]类型的向量中)。
要求是必须使用以下两个步骤来构建加密过程:
- 第一个(
step[0]中的值)用于将从密码char的第一个位置开始的值(ASCII)添加到加密密钥的第一个位置向量步数等于第一步step[0];
例如,将char password[0] 添加到int key[0],然后将char password[1] 添加到int key[1],以此类推,步数等于step[0] 中的值。
- 第二个(
step[1])从密码char的ASCII值的对应位置减去步数等于第二步(step[1])的加密密钥值。
例如,从int key[5] 中减去char password[5],然后从int key[6] 中减去char password[6],依此类推,步数等于step[1] 中的值。
然后,该过程重复直到密码字符的长度结束。
我构建了一个如下所示的函数(添加一些步骤,然后减去一些其他步骤,并重复该过程直到密码字符结束 - 加密密钥向量具有相同的长度为密码字符)。
结果被放置在一个新的向量中(用于加密)或一个新的char(用于查找密码的反向过程)。
void criptareFinal(char password4[255],
int longKey1[255],
int b4,
int step2[2]) {
int encryptedPass[255];
int a = step2[0],
b = step2[1],
n = b4,
i,
ap = a,
bp = b;
for (i = 0; i < n; i++) {
if (ap > 0) {
encryptedPass[i] = longKey1[i] + password4[i];
ap--;
}
else if (bp > 0) {
encryptedPass[i] = longKey1[i] - password4[i];
bp--;
}
else if (ap == 0 && bp == 0) {
ap = a;
bp = b;
}
}
int i1;
printf("\n");
for (i1 = 0; i1 < b4; i1++)
printf("%d ", encryptedPass[i1]);
}
然后如果我尝试printf 向量(用于加密过程)以显示向量的内容,则会出现类似于此的消息:
1090 923 916 1151 942 913 962 998 960 936 962 917 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460
为什么会显示“-858993460”?
另外,如果尝试使用以下代码在printf 和char 中显示密码(将加密密码转换为可读密码),
void decriptareFinal(int encryptedPass5[255],
int longKey2[255],
int b5,
int steps3[2]) {
char Password1[255];
int a = steps3[0],
b = steps3[1],
n = b5,
i2,
ap = a,
bp = b;
for (i2 = 0; i2 < n; i2++) {
if (ap > 0) {
Password1[i2] = encryptedPass5[i2] - longKey2[i2];
ap--;
}
else if (bp > 0) {
Password1[i2] = longKey2[i2] - encryptedPass5[i2];
bp--;
}
else if (ap == 0 && bp == 0) {
ap = a;
bp = b;
}
}
int j2;
printf("\n");
for (j2 = 0; j2 < b5; j2++)
printf("%c", Password1[j2]);
}
然后出现这条消息:
côő~ypaXOF╠╠╠╠╠╠╠╠
什么是“╠”?
这个“╠╠╠╠╠╠╠╠”是不正确的显示(其余的“côő~ypaXOF”是正确的)。
还有。我尝试将[0] 的手动 形式添加和减去到字符串/向量的末尾,如果这样做,则不会出现-858993460 类型或╠╠╠╠╠╠╠╠ 类型的错误消息。
它工作正常,这告诉我char(密码)或int(密钥)中的值是正确的。
如果它很重要,我在 Windows 64 位 上工作,但我使用 Visual Studio。
另外,我有一个 Mac。那里我有同样的问题,但不是-858993460 或╠╠╠╠╠╠╠╠ 我收到其他消息(例如0 而不是-858993460)。
【问题讨论】:
-
哇。你能把整个事情简化为问题描述的几句话和minimal reproducible example吗?
-
这些字符来自code page 437或经典的DOS字符。你是在那种环境下运行这个编译器的吗?
-
当您使用 Visual Studio 编写 C++ 代码时,-858993460 是一个神奇的数字。 0xcccccccc,它告诉你你正在使用一个未初始化的变量。字符串也是如此,代码页 437 中也是 0xcc。使用未初始化的变量总是一个错误,它们的不稳定值可以帮助您找到错误。
-
b6 和 b7 定义在哪里?
-
@tadman:在参数列表中,
char x[255]不传递特定长度字符数组的副本,它传递一个指针,就像char * x。 255 被忽略并且具有误导性。长度用于多维数组,但总是忽略第一个大小,例如char x[][42]很好。