Isa*_*iah 7 c encryption cstring query-string
我正在尝试加密我在打开网址时正在制作的游戏上的查询字符串.它并不复杂,实际上因为我在游戏引擎上工作所以它需要尽可能简单.如果我的等级过低,往往会大惊小怪.
我已经创建了查询字符串,我只需要获取它的每个字符并从字符中减去15以轻微加密它.我只是想做一个能阻止大多数用户的简单加密.
我希望我能给出一个代码示例,但我对C没有太多经验,我甚至不确定从哪里开始.游戏引擎的api通常会让一切变得简单.
son*_*fRa 18
这些答案都不构成任何形式的合理加密.
您实际想要做的是使用某种形式的经过身份验证的加密,以及某种形式的安全密钥派生算法.我的个人推荐是libsodium.它提供了非常好的默认值,以及相对难以出错的API.
有几种不同的方法可以做到这一点:
所有这些可能性都集成到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*/
}
Run Code Online (Sandbox Code Playgroud)
对于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 */
}
Run Code Online (Sandbox Code Playgroud)
现在,密钥数组包含一个适合在上面的代码示例中使用的密钥.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! */
}
Run Code Online (Sandbox Code Playgroud)
此代码首先生成密钥对双方(通常,这种情况会发生bob的和Alice的机器上分开,他们会互相发送的公共密钥,同时保持自己的密钥,那么,秘密).
然后,生成一个随机的随机数,并且调用crypto_box_easy(...)加密消息从alice到bob(使用bob的公钥加密,以及alice的密钥进行签名).
然后(在通过网络发送消息之后),crypto_box_open_easy(...)bob使用呼叫来解密消息(使用他自己的秘密密钥进行解密,并使用alice的公钥来验证签名).如果由于某种原因验证消息失败(有人试图篡改它),则由非零返回码表示.
你的"加密"不会欺骗任何人.
在线可以获得众所周知的安全加密算法.
例如: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];
}
Run Code Online (Sandbox Code Playgroud)
假设包含查询字符串的数组长度为8个字节或更少.增加长度secret以满足您的需求.
void doTerribleEncryptionMethod(char * arr, int arrSize)
{
int i;
for(i = 0; i < arrSize; i++)
{
arr[i] -= 15;
}
}
Run Code Online (Sandbox Code Playgroud)
注意函数名称.你想做的是愚蠢的,而且毫无价值.
你可以用一个非常简单的功能来做到这一点:
void encrypt(char *s)
{
int i, l = strlen(s);
for(i = 0; i < l; i++)
s[i] -= 15;
}
Run Code Online (Sandbox Code Playgroud)
还有一个您可能感兴趣的简单加密算法,它叫做XOR密码.