XMoravec
Project

University Engineering Labs: Crypto, Mobile, and C++ Design

02/15/2026 · 8 min read

A technical compilation of university projects across C cryptography, Android peer-to-peer messaging, and C++ interpreter design.

CJavaC++CryptographyAndroidUniversity

Project Intent

This article consolidates three university projects I still consider technically important: BigNumbers (C, arbitrary-precision arithmetic and RSA), Super Proximity Messenger (Android + Nearby Connections), and PB161_Cplusplus (interpreter/game assignments with stricter parsing and OOP patterns). Public project reference: BigNumbers repository.

  • Build practical low-level intuition for memory, data representation, and arithmetic correctness in C.
  • Implement real asynchronous communication behavior on Android using Nearby Connections API.
  • Design parser/interpreter logic in C++ with strict validation and predictable error handling.

Architecture Snapshot

  • BigNumbers (C, April 2021, collaborative): custom BigNum structure with base-10 digits in integer arrays, conversion helpers, and modular arithmetic utilities for cryptographic operations.
  • Super Proximity Messenger (Java, May 2021): host/client architecture around Nearby advertising + discovery flows, with connectivity logic separated from UI activities.
  • PB161_Cplusplus (C++, July 2023): progressively more complex tasks including interpreter-like command processing, object-oriented gameplay structure, and design-pattern practice.
  • Additional references: CosmosDB-Flask-Mongo-Sample (fork, April 2023) — https://github.com/xmoravec/CosmosDB-Flask-Mongo-Sample
  • Additional references: 2019-pb162-seminar-project (Java, July 2023) — https://github.com/xmoravec/2019-pb162-seminar-project

Shipped Feature Set

  • BigNumbers: add/subtract/multiply with carry handling, addmod/multmod/expmod helpers, Fermat primality test, random prime generation, and RSA keygen/encrypt/decrypt flow.
  • BigNumbers conversion helpers: string ↔ BigNum, integer conversions, and utility testing with larger computed values.
  • Messenger: RecyclerView-based chat UI, endpoint lifecycle management, JSON message serialization, and profile/theme persistence.
  • C++ coursework: procedural instruction parsing, validation/complaint strategy, and reference checks for defined procedures.
  • Repository links: https://github.com/xmoravec/BigNumbers · https://github.com/xmoravec/MICS2-50-Super-Proximity-Messenger · https://github.com/xmoravec/PB161_Cplusplus

Implementation Examples

Reusable code surfaces mirror the style used in project previews and deeper technical pages.

bignum-string-and-addition.c

1bignum *bignum_fromstring(char *str) {
2  bignum* num = bignum_new();
3  bignum_enlarge(num, strlen(str));
4  for (unsigned int i = 0; i < strlen(str); i++) {
5    num->tab[i] = str[i] - '0';
6  }
7  return num;
8}
9
10bignum *bignum_add(bignum *a, bignum *b) {
11  bignum *c = bignum_new();
12  c->size = max(a->size, b->size) + 1;
13  c->tab = realloc(c->tab, c->size * sizeof(int));
14
15  int j = a->size;
16  int l = b->size;
17  int k = c->size;
18  int carry = 0;
19  int tmp = 0;
20
21  for (int i = 0; i < l; i++) {
22    tmp = a->tab[j - i - 1] + b->tab[l - i - 1] + carry;
23    carry = tmp / B;
24    c->tab[k - i - 1] = tmp % B;
25  }
26  for (int i = l; i < k - 1; i++) {
27    tmp = a->tab[j - i - 1] + carry;
28    carry = tmp / B;
29    c->tab[k - i - 1] = tmp % B;
30  }
31  c->tab[0] = carry;
32  if(c->tab[0] == 0) {
33    c->tab++;
34    c->size--;
35  }
36  return c;
37}

chat-adapter.java

1public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ChatHolder> {
2
3  private final LayoutInflater inflater;
4  private final List<Message> messages;
5
6  public ChatAdapter(Context context, List<Message> messages) {
7    inflater = LayoutInflater.from(context);
8    this.messages = messages;
9  }
10
11  public void addMessage(Message message) {
12    messages.add(messages.size(), message);
13    notifyDataSetChanged();
14  }
15
16  @Override
17  public int getItemViewType(int position) {
18    return messages.get(position).isMyChat() ? 0 : 1;
19  }
20
21  static class ChatHolder extends RecyclerView.ViewHolder {
22    private final TextView messageText;
23    private final TextView userText;
24    private final TextView timestamp;
25
26    public void bind(Message message) {
27      messageText.setText(message.getMessage());
28      if (!message.isMyChat()) userText.setText(message.getEndpoint().getName());
29      Date date = new Date();
30      date.setTime(message.getTimestamp());
31      timestamp.setText(new SimpleDateFormat("EEE, MMM d, h:mm a").format(date));
32    }
33  }
34}

procedure-validation.cpp

1void Program::read_inst(const std::vector<std::string>& words, Procedure& proc) {
2  if (words.size() == 1) {
3    if (is_jumpinst(words[0]) || !allowed_characters(words[0]))
4      Complain::invalidSource(line_count, "If without parameter or invalid character\n");
5    if (is_inst(words[0]) || has_procedure(words[0]))
6      proc.instructions.push_back(words[0]);
7    else
8      Complain::undefinedReference(proc.name, words[0], words[0], " is undefined\n");
9  }
10}
11
12bool Program::has_procedure(const std::string& name) const {
13  for (auto& p : procedures) {
14    if (p.name == name) {
15      return true;
16    }
17  }
18  return false;
19}

Current Focus

  • Extract reusable patterns from these repositories into cleaner modern writeups and selected refactors.
  • Preserve technical history while presenting architecture and trade-offs in a clearer portfolio style.
  • Add representative screenshots and benchmark notes where they increase signal for reviewers.