只需加密C中的字符串即可

我正在尝试加密打开url时正在制作的游戏上的查询字符串。 它不必复杂,事实上因为我在游戏引擎上工作所以它需要尽可能简单。 如果我的水平太低,它往往会大惊小怪。

我已经创建了查询字符串,我只需要获取它的每个字符并从字符中减去15以轻微加密它。 我只是想做一个能阻止大多数用户的简单加密。

我希望我能给出一个代码示例但我在C中没有太多经验,我甚至不确定从哪里开始。 游戏引擎的api通常会让一切变得简单。

这些答案都不构成任何forms的合理加密。

您实际想要做的是使用某种forms的身份validation加密,以及某种forms的安全密钥派生算法。 我的个人推荐是libsodium 。 它提供了非常好的默认值,以及相对难以出错的API。

有几种不同的方法可以做到这一点:

  1. 使用随机密钥validation加密的密钥加密
  2. 密钥加密,密钥源自密码短语导出
  3. 密钥协议的混合加密。 公钥加密

所有这些可能性都被整合到libsodium中并且相对容易实现。

以下代码示例直接取自libsodium文档 。

1:

#define MESSAGE ((const unsigned char *) "test") #define MESSAGE_LEN 4 #define CIPHERTEXT_LEN (crypto_secretbox_MACBYTES + MESSAGE_LEN) unsigned char nonce[crypto_secretbox_NONCEBYTES]; unsigned char key[crypto_secretbox_KEYBYTES]; unsigned char ciphertext[CIPHERTEXT_LEN]; /* Generate a secure random key and nonce */ randombytes_buf(nonce, sizeof nonce); randombytes_buf(key, sizeof key); /* Encrypt the message with the given nonce and key, putting the result in ciphertext */ crypto_secretbox_easy(ciphertext, MESSAGE, MESSAGE_LEN, nonce, key); unsigned char decrypted[MESSAGE_LEN]; if (crypto_secretbox_open_easy(decrypted, ciphertext, CIPHERTEXT_LEN, nonce, key) != 0) { /* If we get here, the Message was a forgery. This means someone (or the network) somehow tried to tamper with the message*/ } 

对于2 :(从密码中获取密钥)

 #define PASSWORD "Correct Horse Battery Staple" #define KEY_LEN crypto_secretbox_KEYBYTES unsigned char salt[crypto_pwhash_SALTBYTES]; unsigned char key[KEY_LEN]; /* Choose a random salt */ randombytes_buf(salt, sizeof salt); if (crypto_pwhash (key, sizeof key, PASSWORD, strlen(PASSWORD), salt, crypto_pwhash_OPSLIMIT_INTERACTIVE, crypto_pwhash_MEMLIMIT_INTERACTIVE, crypto_pwhash_ALG_DEFAULT) != 0) { /* out of memory */ } 

现在,密钥数组包含一个适合在上面的代码示例中使用的密钥。 我们生成了一个从用户定义的密码派生的randombytes_buf(key, sizeof key)而不是使用randombytes_buf(key, sizeof key)来生成随机密钥,并将其用于加密。

3是3种类型中“最复杂”的。 如果你有两方沟通,那就是你使用的。 每一方都生成一个“密钥对”,其中包含公钥和密钥。 通过这些密钥对,他们可以共同商定一个“共享密钥”,它们可以用来为彼此加密(和签名)数据:

 #define MESSAGE (const unsigned char *) "test" #define MESSAGE_LEN 4 #define CIPHERTEXT_LEN (crypto_box_MACBYTES + MESSAGE_LEN) unsigned char alice_publickey[crypto_box_PUBLICKEYBYTES]; unsigned char alice_secretkey[crypto_box_SECRETKEYBYTES]; crypto_box_keypair(alice_publickey, alice_secretkey); unsigned char bob_publickey[crypto_box_PUBLICKEYBYTES]; unsigned char bob_secretkey[crypto_box_SECRETKEYBYTES]; crypto_box_keypair(bob_publickey, bob_secretkey); unsigned char nonce[crypto_box_NONCEBYTES]; unsigned char ciphertext[CIPHERTEXT_LEN]; randombytes_buf(nonce, sizeof nonce); if (crypto_box_easy(ciphertext, MESSAGE, MESSAGE_LEN, nonce, bob_publickey, alice_secretkey) != 0) { /* error */ } unsigned char decrypted[MESSAGE_LEN]; if (crypto_box_open_easy(decrypted, ciphertext, CIPHERTEXT_LEN, nonce, alice_publickey, bob_secretkey) != 0) { /* message for Bob pretending to be from Alice has been forged! */ } 

这段代码首先生成两个密钥对(通常,这将分别发生在bob和alice的机器上,并且他们会相互发送他们的公钥,同时保密他们的秘密密钥)。

然后,生成一个随机的随机数,并且对crypto_box_easy(...)的调用将加密从alice到bob的消息(使用bob的公钥加密,并使用alice的密钥进行签名)。

然后(在通过网络发送消息之后),bob使用对crypto_box_open_easy(...)的调用来解密消息(使用他自己的秘密密钥进行解密,并使用alice的公钥来validation签名)。 如果由于某种原因validation消息失败(有人试图篡改它),则由非零返回码表示。

你的“加密”不会欺骗任何人。

在线可以很好地实现众所周知的安全加密算法。

例如: Twofish

编辑:

XOR的示例实现:

 void encrypt(char *array, int array_size) { int i; char secret[8] = { 22, 53, 44, 71, 66, 177, 253, 122 }; for(i = 0; i < array_size; i++) array[i] ^= secret[i]; } 

假设包含查询字符串的数组长度为8个字节或更少。 增加secret长度以满足您的需求。

 void doTerribleEncryptionMethod(char * arr, int arrSize) { int i; for(i = 0; i < arrSize; i++) { arr[i] -= 15; } } 

注意函数名称。 你想做的是愚蠢的,而且毫无价值。

你可以用一个非常简单的function来做到这一点:

 void encrypt(char *s) { int i, l = strlen(s); for(i = 0; i < l; i++) s[i] -= 15; } 

还有一个您可能感兴趣的简单加密算法,它叫做XOR密码 。

SonOfRa已经提出了正确的答案 。

但是如果你打算使用一些可怕的东西来掩盖一个字符串而不实际加密它,那么GNU C库提供了一个已经编写并且易于翻转的memfrob(3)

如果你愿意,你可以只是xor字节
通过迭代数组并使用^ =这个解密和加密

 #include  char* xorit(char* str, int key){ // any number for key except for(int i=0; i 

您可以将base64的变体与自定义字母表一起使用,或者只使用随机字母表。 这不是很安全,但在你的情况下它可能就足够了。 该算法被广泛使用,因此您可以轻松找到可以提供自定义字母表的实现。

奖励点是,无论您放入查询字符串,编码表单都将包含有效的URL字符,如果您选择适当的字母表。