我正在尝试构建一个对密码进行加密的程序,然后执行相反的过程(从已加密的密码中读出正确的密码)。
为此,我有:
密码(char[]
类型);
加密密钥( vector -int[]
类型),其长度与密码的char
相同;
两步(也放置在int step[2]
类型的 vector 中)。
要求是必须使用以下两个步骤来构建加密过程:
step[0]
中的值)用于将密码char
的第一个位置开始的值(ASCII)添加到加密密钥 vector的第一个位置等于第一步step[0]
的许多步骤; 将char password[0]
添加到int key[0]
,然后将char password[1]
添加到int key[1]
,依此类推,直到步数等于{{1}中的值}。
step[0]
从密码step[1]
的ASCII值的对应位置中减去与第二个步骤({{ 1}})。是从char
中减去step[1]
,然后从char password[5]
中减去int key[5]
,依此类推,直到步数等于{{1}中的值}。
然后重复该过程,直到密码字符的长度结束。
我建立了一个下面的函数,该函数应该执行此操作(将多个步骤相加,然后将多个其他步骤相减,然后重复该过程直到密码char结束-加密密钥向量具有相同的长度作为密码char)。
结果被放置在新的矢量中(用于加密)或新的char password[6]
中(用于反向查找密码)。
int key[6]
然后,如果我尝试step[1]
矢量(用于加密过程)以显示矢量的内容,则会出现类似以下消息:
char
为什么显示“ -858993460”?
此外,如果尝试使用以下代码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
然后出现此消息:
printf
什么是“╠”?
此“╠╠╠╠╠╠╠╠”显示不正确(其余“côő〜ypaXOF”正确)。
也。我试图在字符串/向量的末尾添加手动形式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]);
}
或类型为{{1 }}出现。
它工作正常,并且告诉我côő~ypaXOF╠╠╠╠╠╠╠╠
(密码)或[0]
(键)中的值正确。
如果这很重要,我可以在 Windows 64bit 上工作,但是我使用的是 Visual Studio 。
另外,我有一台 Mac 。那里我有同样的问题,但是我收到的不是其他消息(例如-858993460
而不是╠╠╠╠╠╠╠╠
,而不是char
或int
。
答案 0 :(得分:0)
我对您的代码进行了很多更改。这是列表:
#include
标签(我想您已经有一些并且没有发布它们了)char*
而不是char[]
,在函数参数中使用char
数组并不常见,我什至不知道它们在代码中如何工作。 ap
,bp
和其他一些变量。由于C是传递值,因此steps
变量不需要临时变量。malloc
(动态内存分配),而不是将char
数组放在堆栈上。这更加灵活,减少了此类陷阱的发生,但确实为段错误开辟了更多的可能性。char
),它将使ap == 0 && bp == 0
保持不变。fprintf
语句,因此您可以查看正在发生的情况。对于奇怪的╠字符,除了您可能有一些内存错误或者您的环境正在Unicode和ASCII之类的切换之外,我看不到为什么您的代码会打印出来。坦白说,我不想弄清楚,因为您的代码有点混乱,我也不认为您发布了所有代码,因为它在我第一次运行时出现编译错误。
我还向'\0'
字符串的末尾添加了一些空终止符(malloc
),这对于调试时正确打印字符串很方便。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *criptareFinal(char *plaintext, int *key, int len, int *steps) {
char *ciphertext = malloc(len + 1);
int a = steps[0], b = steps[1], n = len;
for (int i = 0; i < n; i++) {
if (a == 0 && b == 0) {
a = steps[0];
b = steps[1];
}
if (a > 0) {
ciphertext[i] = key[i] + plaintext[i];
a--;
}
else if (b > 0) {
ciphertext[i] = key[i] - plaintext[i];
b--;
}
}
ciphertext[len] = '\0';
fprintf(stderr, "\n");
fprintf(stderr, "ENCRYPTION: ");
for (int i = 0; i < n; i++)
fprintf(stderr, "%d ", ciphertext[i]);
return ciphertext;
}
char *decriptareFinal(char *ciphertext, int *key, int len, int *steps) {
char *plaintext = malloc(len + 1);
int a = steps[0], b = steps[1], n = len;
for (int i = 0; i < n; i++) {
if (a == 0 && b == 0) {
a = steps[0];
b = steps[1];
}
if (a > 0) {
plaintext[i] = ciphertext[i] - key[i];
a--;
}
else if (b > 0) {
plaintext[i] = key[i] - ciphertext[i];
b--;
}
}
plaintext[len] = '\0';
fprintf(stderr, "\n");
fprintf(stderr, "DECRYPTION: ");
for (int i = 0; i < n; i++)
fprintf(stderr, "%d ", plaintext[i]);
return plaintext;
}
int main() {
char *toEncrypt = "Hello World!";
int steps[] = {2, 3};
int key[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
int len = strlen(toEncrypt);
fprintf(stderr, "INITIAL: ");
for (int i = 0; i < len; i++)
fprintf(stderr, "%d ", toEncrypt[i]);
fprintf(stderr, "\n");
char *encrypted = criptareFinal(toEncrypt, key, len, steps);
fprintf(stderr, "\n");
fprintf(stderr, "ENCRYPTED: %s\n", encrypted);
char *decrypted = decriptareFinal(encrypted, key, len, steps);
fprintf(stderr, "\n");
fprintf(stderr, "DECRYPTED: %s\n", decrypted);
}
注意:此代码中没有错误处理,因此,如果用户输入几乎完全无效,则代码将中断并可能导致段错误,无限循环等。您应该添加错误处理在适当的应用程序中使用它之前,请进行每个char*
操作和数组迭代。
INITIAL: 72 101 108 108 111 32 87 111 114 108 100 33
ENCRYPTION: 73 103 -105 -104 -106 38 94 -103 -105 -98 111 45
ENCRYPTED: Igùÿû&^Öù₧o-
DECRYPTION: 72 101 108 108 111 32 87 111 114 108 100 33
DECRYPTED: Hello World!
如果您有任何疑问,请告诉我。
答案 1 :(得分:0)
在第一个函数中,您一次将i
从0
迭代到n
。但是,并非所有通过循环体的路径都为encryptedPass[i]
分配任何内容-对于最后一个else if
以及没有任何if
条件都匹配的情况就是这种情况。对于第二个功能也是如此,但对于Password1[i]
。
但是,在每个函数的末尾,您都会无条件打印这些数组中的所有值,这意味着它们是未初始化的值。 (并且您迭代到未知值b6
和b7
,而您可能应该迭代到您在第一个循环中使用的同一n
。)
要解决此问题,请确保每次迭代都向索引中写入内容,或者确保有单独的写入位置索引或指针,并且仅在您写入内容时将其前进。
答案 2 :(得分:0)
尤其是对于Arkku,谢谢大家的回答。 这很有帮助。 我修复了它,现在工作正常。 在“ else if(ap == 0 && bp == 0)”之后的最后一个条件中,我添加了“ i = i-1”,以便在同一位置进行迭代。
这就是我所做的:
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body data-spy="scroll" data-target=".navbar" data-offset="50">
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">WebSiteName</a>
</div>
<div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav">
<li><a href="#section1">Section 1</a></li>
<li><a href="#section2">Section 2</a></li>
<li><a href="#section3">Section 3</a></li>
<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Section 4 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#section41">Section 4-1</a></li>
<li><a href="#section42">Section 4-2</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</nav>
<div id="section1" class="container-fluid">
<h1>Section 1</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section2" class="container-fluid">
<h1>Section 2</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section3" class="container-fluid">
<h1>Section 3</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section41" class="container-fluid">
<h1>Section 4 Submenu 1</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div id="section42" class="container-fluid">
<h1>Section 4 Submenu 2</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
</body>
</html>
那解决了这个问题。
与其他功能相同:
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;
i = i - 1;
}
当我进行反向加密时,加密时不再显示“ -858993460”,在打印密码时也不再显示“╠╠╠╠╠╠╠╠”。
再次感谢大家,对于原信息的冗长,我们深表歉意。 下次我将考虑到这一点。
cd