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.