summary refs log tree commit diff stats
path: root/src/org/blog/c/cherry.org
blob: 324aa4cb731ebc3a2163d0572535e012a8453638 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#+title: Reviving Caesar with a Cherry-flavored Crystal
#+AUTHOR: Crystal & Sloth
#+OPTIONS: ^:{}
#+OPTIONS: num:nil
#+EXPORT_FILE_NAME: ../../../../blog/c/cherry.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../../src/css/colors.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../../src/css/style.css"/>
#+OPTIONS: html-style:nil
#+OPTIONS: toc:nil
#+HTML_HEAD: <link rel="icon" type="image/x-icon" href="../../../favicon.png">
#+HTML_LINK_HOME: https://crystal.tilde.institute/

* What ?...
That is probably your reaction reading this title, and no, this isn't a randomly generated sentence, but rather a simple encryption algorithm I recently made (Actually the first encryption algorithm i make at all!!). Meet *Cherry-Crystal Encryption*.


* Okay so, what is this all about ?
This encryption Algorithm that we will call *CCE* for short, takes inspiration from the Caesar cipher which needn't an introduction (you can find great explanations online). But what about mine you might ask ?


- It's actually pretty simple. We start with a *Cherry* or a *Visible phrase*, or a *Decoy*, that we will share to people who we don't want to know the secret phrase..
- Then we ask the user to enter their *Crystal*, *invisible phrase* or *secret*.
- The program then outputs an array of Integers called the *Mask*, or the *Shift*. That is, the shift required to go from cherry_{i} to crystal_{i}.
- Finally, we use both the *Cherry* and *Mask* to get the *Crystal*, a single missing number or letter from both of them can and will output rubbish content.


* The Code :
 #+BEGIN_SRC c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void encrypt(char cherry[], char crystal[], int mask[]) {
  int i;
  for (i = 0; i < strlen(cherry) - 1; i++) {
    mask[i] = cherry[i] - crystal[i];
  }
  for (i = strlen(cherry) - 1; i < strlen(crystal) - 1; i++) {
    mask[i] = crystal[i];
  }
}
void decrypt(char cherry[], char crystal[], int mask[], int length) {
  int i, end = 1;
  for (i = 0; i < length; i++) {
    if (i == strlen(cherry) - 1 || end == 0) {
      crystal[i] = mask[i];
      end = 0;
    } else {
      crystal[i] = cherry[i] - mask[i];
    }
  }
}
int main(int argc, char *argv[]) {
  const int size = 1028;
  char cherry[size], cherry2[size], crystal[size], crystal2[size];
  int mask[size], mask2[size], i;
  int length = 0;
  puts("Enter the Cherry: ");
  fgets(cherry, size, stdin);
  puts("Enter the Crystal: ");
  fgets(crystal, size, stdin);
  encrypt(cherry, crystal, mask);
  for (i = 0; i < strlen(crystal) - 1; i++) {
    printf("%d ", mask[i]);
    length++;
  }
  printf("\nYour mask is : %d characters long", length);
  puts("\n===Decryption: ===\n");
  puts("Enter the Cherry: ");
  fgets(cherry2, size, stdin);
  puts("Enter the size of the Mask: ");
  scanf("%d", &length);
  puts("Enter the mask: ");
  for (i = 0; i < length; i++) {
    scanf("%d", &mask2[i]);
  }
  puts("The Crystal is: ");
  decrypt(cherry2, crystal2, mask2, length);
  puts(crystal2);
  return 0;
}

 #+END_SRC

 The program has been tested both on Alpine OS with Musl libc (thanks [[https://kaa.neocities.org/][Kin]]) and on OpenBSD 7.5-current. In the close future I will make a git repo as i'm planning to upgrade it and just make it better overall, who knows, maybe i will make a library out of it!!