我對cs50編程教程感興趣。在這裏我應該破解一個DES加密的字符串。c - printf(「%s」)打印一個額外的@
首先我專注於創建一個64位大數組,其中包含鹽中使用的所有可能的字符。
在接下來的步驟中,我將它放到兩個for循環中以打印出這兩個for循環的所有可能組合。這就是我現在所處的位置。
出於調試原因,我只是用printf("%s",salt)
打印出來。鹽被定義爲char salt[2]
。但由於某種原因,它總是打印出[email protected]
(xx
每次都如預期的變化,我不知道@
來自哪裏)。
首先,我認爲它可能會超出陣列的一些奇怪的原因,並從隨機存儲器抓取@
。這就是我將它從在線IDE複製到本地XCode的原因。仍然是相同的@
符號。而現在我很困惑從@
來自哪裏。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define _XOPEN_SOURCE // DES - implementation
#include <unistd.h>
// shorthands
#define cypher argv[1]
#define ascii_dot 46
#define ascii_slash 47
#define ascii_zero 48
#define ascii_nine 57
#define salt_size 64
#define majA 65
#define majZ 90
#define minA 97
#define minZ 122
int main(int argc, string argv[]) {
// Checking input
if (argc != 2) {
printf("<usage>\n<./crack <password_hash>");
return 1;
}
// Create a salter
// 2 * 26 for letters + 10 for numbers + dot and slash = 64 = salt_size
char salt_crystal[salt_size];
{ // Own scope to not waste space for salt_iterator
int salt_iterator = 0; // used to create salt crystals
//minuscels
for (int i = minA; i <= minZ; i++)
salt_crystal[salt_iterator++] = (char)i;
//majuscels
for (int i = majA; i <= majZ; i++)
salt_crystal[salt_iterator++] = (char)i;
//ascii_dot to 9
for (int i = ascii_dot; i <= ascii_nine; i++)
salt_crystal[salt_iterator++] = (char) i;
}
// make the salt and forward it to the next function
for (int i = 0, l = salt_size; i < l; i++) {
char salt[2];
salt[0] = salt_crystal[i];
for (int i2 = 0, l2 = salt_size; i2 < l2; i2++) {
salt[1] = salt_crystal[i2];
printf("%s ", salt); // DEBUG
}
}
}
感謝您分享您的代碼。 –
'salt'不是以NUL結尾的字符串,您正在讀取未初始化的內存。 'printf(「%c%c」,salt [0],salt [1]);'應該完成這項工作。 –
@AndreaBiondo將答案添加爲答案,而不是評論!我會upvote。 –