aboutsummarylogtreecommitdiffstats
path: root/rc4.c
diff options
context:
space:
mode:
Diffstat (limited to 'rc4.c')
-rw-r--r--rc4.c92
1 files changed, 13 insertions, 79 deletions
diff --git a/rc4.c b/rc4.c
index bd3ecc9d3044..4fc722079ecb 100644
--- a/rc4.c
+++ b/rc4.c
@@ -27,98 +27,32 @@ char* rc4_getPassword(void) {
return (char*) pass;
}
-void rc4_key_exchange(int keySchedule[KEY_SCHEDULE_LENGTH], char* key) {
- size_t len = strlen(key);
- int j = 0;
+void rc4_encode_string(String* pString, char* password) {
+ int keySchedule[256];
+ size_t key_len = strlen(password);
+ int j = 0, out;
+
+ // KEY EXCHANGE
for (int i = 0; i < KEY_SCHEDULE_LENGTH; i++)
keySchedule[i] = i;
int temp;
for (int i = 0; i < KEY_SCHEDULE_LENGTH; i++) {
- j = (j + keySchedule[i] + key[i % len]) % KEY_SCHEDULE_LENGTH;
+ j = (j + keySchedule[i] + password[i % key_len]) % KEY_SCHEDULE_LENGTH;
temp = keySchedule[i];
keySchedule[i] = keySchedule[j];
keySchedule[j] = temp;
}
-}
-char* rc4_prga(int keySchedule[KEY_SCHEDULE_LENGTH], size_t len) {
- int i = 0, j = 0, temp;
- char* output = malloc(len);
- pointer_alloc_check(output);
- for (int k = 0; k < (int) len; k++) {
+ // PRGA
+ int i = 0;
+ j = 0;
+ for (size_t k = 0; k < pString->len; k++) {
i = (i + 1) % KEY_SCHEDULE_LENGTH;
j = (j + keySchedule[i]) % KEY_SCHEDULE_LENGTH;
temp = keySchedule[i];
keySchedule[i] = keySchedule[j];
keySchedule[j] = temp;
- output[k] = (unsigned char) keySchedule[(keySchedule[i] + keySchedule[j]) % KEY_SCHEDULE_LENGTH];
- }
- return output;
-}
-
-void rc4_execute(char* output, String* pString) {
- for (int i = 0; i < (int) pString->len; i++)
- output[i] ^= pString->data[i];
-}
-
-char* rc4_encode_string(String* pString, char* password) {
- int keySchedule[256];
- rc4_key_exchange(keySchedule, password);
- char* output = rc4_prga(keySchedule, pString->len);
- rc4_execute(output, pString);
- return output;
-}
-
-String* rc4_get_crypted_string(String* input_pString, char* password, int option) {
- String* output_pString = NULL;
- int free_pw = (password == NULL);
- Json* jobj = json_tokener_parse(input_pString->data);
- if (option == ENCRYPT && jobj == NULL) // If trying to encrypt an encrypted portfolio
- printf("Your portfolio is already encrypted.\n");
- else if (option == DECRYPT && jobj != NULL) // If trying to decrypt an unencrypted portfolio
- printf("Your portfolio isn't encrypted.\n");
- else {
- if (password == NULL) { // Get password if not provided
- password = rc4_getPassword();
- if (option == ENCRYPT) { // When encrypting, ask to enter pw twice to make sure
- printf("You will be asked to enter your password again to make sure the entries match.\n");
- sleep(2);
- char* passwordCheck = rc4_getPassword();
- if (strcmp(password, passwordCheck) != 0) {
- printf("Passwords do not match!\n");
- free(password);
- free(passwordCheck);
- json_object_put(jobj);
- return NULL;
- }
- free(passwordCheck);
- }
- }
- output_pString = string_init(); // Set ouput string to en/decrypted data
- free(output_pString->data);
- output_pString->data = rc4_encode_string(input_pString, password);
- output_pString->len = input_pString->len;
- if (option == DECRYPT) {
- json_object_put(jobj);
- // Realloc to add null terminator for json parsing
- output_pString->data = realloc(output_pString->data, output_pString->len + 1);
- pointer_alloc_check(output_pString->data); // Dealing with len is annoying so it's easier to just realloc
- output_pString->data[output_pString->len] = '\0'; // Null terminate string for parsing
- jobj = json_tokener_parse(output_pString->data);
- if (jobj == NULL) { // If after decrypting, the portfolio is not JSON formatted,
- printf("Wrong password!\n"); // then it's the wrong password
- free(password);
- string_destroy(&output_pString);
- return NULL;
- }
- }
- if (free_pw) { // If being called from main
- free(password);
- if (option == ENCRYPT)
- printf("Successfully encrypted your portfolio.\n");
- else printf("Successfully decrypted your portfolio.\n");
- }
+ out = (unsigned char) keySchedule[(keySchedule[i] + keySchedule[j]) % KEY_SCHEDULE_LENGTH];
+ pString->data[k] ^= out; // XOR to encode/decode
}
- json_object_put(jobj);
- return output_pString;
} \ No newline at end of file