Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

kaalka

Kaalka: Time-based encryption library for Node.js supporting robust, lossless text, file, and chunked file encryption using clock hand angles, trigonometric functions, and pure time-first protocol. Includes CLI, protocol wrappers, and full test suite.

encryption, cryptography, time-based, kaalka, file-encryption, nodejs, security

readme

Kaalka: Time-Based Encryption Library for Node.js

Kaalka is a robust, time-based encryption library for Node.js, supporting secure encryption and decryption of text, files, and large files using system time, NTP time, or a user-provided timestamp. It includes chunked file support, a CLI, protocol wrappers, and comprehensive tests. Kaalka is suitable for secure messaging, cryptographic experiments, and time-sensitive data protection.

🚀 Features

  • Time-based encryption: Use system time, NTP time, or any timestamp (ISO or HH:MM:SS) as the encryption key.
  • Chunked file encryption: Encrypt/decrypt large files in chunks with manifest and per-chunk key/beat.
  • Robust and unpredictable: Combines trigonometric functions, clock hand angles, and character indices for strong, non-trivial encryption.
  • Easy integration: Simple Node.js API for text, file, and chunked file encryption/decryption.
  • CLI support: Command-line interface for file and chunked file operations.
  • NTP support: Includes KaalkaNTP for network time protocol-based encryption.
  • Full test suite: Jest tests for all core, protocol, file, and chunked file features.

    📦 Installation

npm install kaalka

� Usage

Text Encryption/Decryption

const Kaalka = require('./kaalka');
const kaalka = new Kaalka();
let encrypted = kaalka.encrypt("Hello, world!");
let decrypted = kaalka.decrypt(encrypted);
encrypted = kaalka.encrypt("Hello, world!", "14:35:22");
decrypted = kaalka.decrypt(encrypted, "14:35:22");

File Encryption/Decryption

let encryptedFile = await kaalka.encrypt("test_image.jpg"); // Produces test_image.kaalka
let decryptedFile = await kaalka.decrypt(encryptedFile); // Produces test_image.jpg
encryptedFile = await kaalka.encrypt("test_data.csv", "14:35:22");
decryptedFile = await kaalka.decrypt(encryptedFile, "14:35:22");

Chunked File Encryption/Decryption

const { encryptFile, decryptFile } = require('./lib/file_weave');
// Encrypt large file in chunks
await encryptFile('large.txt', resonance, '2025-09-05T12:00:00.000Z', 'manifest.json');
// Decrypt large file from chunks
await decryptFile('large_out.txt', resonance, '2025-09-05T12:00:00.000Z', 'manifest.json');

CLI Usage

node cli/kaalka_time_cli.js encrypt <inputFile> <timestamp>
node cli/kaalka_time_cli.js decrypt <encryptedFile> <timestamp>

🧩 Protocol & NTP Support

  • Time-first protocol wrappers for advanced use cases.
  • NTP time synchronization via KaalkaNTP.

    🧪 Testing

  • All features are covered by Jest tests: core, protocol, file, chunked file, and edge cases.
  • Run tests with:
    npm test

    ✅ Deployment

  • All features are implemented and tested.
  • All tests pass.
  • The codebase is robust and ready for npm deployment.

�🔒 How the Algorithm Works

Kaalka transforms each character in your message using a key derived from the angles between the hour, minute, and second hands of a clock at a given time. The algorithm:

  • Calculates angles for the provided or current time.
  • Selects trigonometric functions based on the quadrant of each angle.
  • Combines these values with the character's index and the time to generate a unique, non-reversible transformation for each character.
  • Decryption reverses this process using the same timestamp.

Note: Encryption and decryption must use the same timestamp (or occur at the same second if using system time).

📦 Installation

npm install kaalka

📝 Usage

Unified Text, Image, and Media Encryption/Decryption

const Kaalka = require('./kaalka');
const kaalka = new Kaalka();

// Text encryption/decryption (system time)
let encrypted = kaalka.encrypt("Hello, world!");
let decrypted = kaalka.decrypt(encrypted);

// Text encryption/decryption (explicit time)
encrypted = kaalka.encrypt("Hello, world!", "14:35:22");
decrypted = kaalka.decrypt(encrypted, "14:35:22");

// File encryption/decryption (any file type, system time)
let encryptedFile = await kaalka.encrypt("test_image.jpg"); // Produces test_image.kaalka
let decryptedFile = await kaalka.decrypt(encryptedFile); // Produces test_image.jpg

// File encryption/decryption (explicit time)
encryptedFile = await kaalka.encrypt("test_data.csv", "14:35:22");
decryptedFile = await kaalka.decrypt(encryptedFile, "14:35:22");

// Folder workflow example
const fs = require('fs').promises;
const path = require('path');
const encPath = await kaalka.encrypt("test_image.jpg", "14:35:22");
await fs.mkdir('encrypted', { recursive: true });
await fs.mkdir('decrypted', { recursive: true });
await fs.rename(encPath, path.join('encrypted', 'test_image.kaalka'));
const decPath = await kaalka.decrypt(path.join('encrypted', 'test_image.kaalka'), "14:35:22");
await fs.rename(decPath, path.join('decrypted', 'test_image.jpg'));

Note:

  • Encrypted files use only the .kaalka extension (e.g., test_image.kaalka, video.kaalka, music.kaalka).
  • Decrypted files restore the original name and extension (e.g., test_image.jpg, video.mp4, music.mp3).
  • The library supports all file types, including images, videos, music, text, CSV, JSON, XML, and more.
  • Encryption and decryption are lossless and robust for all binary formats.

⚠️ Security Notes

  • If you do not provide a timestamp, the current system time is used for encryption and decryption. Encryption and decryption must occur at the same second for the result to be correct.
  • For reproducibility and secure communication, always provide an explicit timestamp string (format: 'HH:MM:SS').
  • The strength of encryption depends on the secrecy and unpredictability of the timestamp used.

📄 License

See the LICENSE file for details.

🤝 Contributing

Contributions, bug reports, and feature requests are welcome! Please open an issue or submit a pull request on GitHub.