// ChaCha20-Poly1305: تشفير وتوثيق ثم فك؛ والعبث يُكتشف.
استورد std.io.println;
استورد std.text.number;
استورد std.text.from_bytes;
استورد std.crypto.chacha20_poly1305;
عرف الرئيسية(): عدد {
دع المفتاح: متغير متجه ط8 = [];
دع ف: متغير طبيعي = 0;
طالما (ف < 32) { ألحق(المفتاح, (ف + 1) مثل ط8); ف := ف + 1; }
دع النونس: متجه ط8 = [0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8];
دع الترويسة: متجه ط8 = بايتات_من_نص("v1");
دع السر: متجه ط8 = بايتات_من_نص("نلتقي ظهرا");
دع المختوم: متغير متجه ط8 = اختم_تشاتشا20_بولي1305(&المفتاح, &النونس, &الترويسة, &السر);
اطبع_سطر(طبيعي_إلى_نص(الطول(المختوم) مثل طبيعي));
طابق افتح_تشاتشا20_بولي1305(&المفتاح, &النونس, &الترويسة, &المختوم) مع
| اختياري.موجود(الصريح) -> { اطبع_سطر(من_بايتات(&الصريح)); }
| اختياري.لا_شيء -> { اطبع_سطر("فشل التحقق"); };
المختوم[0] := المختوم[0] ^ 1;
طابق افتح_تشاتشا20_بولي1305(&المفتاح, &النونس, &الترويسة, &المختوم) مع
| اختياري.موجود(_) -> { اطبع_سطر("لم يُكتشف العبث"); }
| اختياري.لا_شيء -> { اطبع_سطر("اكتُشف العبث"); };
أرجع 0;
}// ChaCha20-Poly1305: encrypt and authenticate, then decrypt; tampering is detected.
import std.io.println;
import std.text.number;
import std.text.from_bytes;
import std.crypto.chacha20_poly1305;
def main(): int {
let key: mutable vector u8 = [];
let i: mutable uint = 0;
while (i < 32) { append(key, (i + 1) as u8); i := i + 1; }
let nonce: vector u8 = [0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8];
let header: vector u8 = bytes_from_text("v1");
let secret: vector u8 = bytes_from_text("meet at noon");
let sealed: mutable vector u8 = chacha20_poly1305_seal(&key, &nonce, &header, &secret);
println(uint_to_text(length(sealed) as uint));
match chacha20_poly1305_open(&key, &nonce, &header, &sealed) with
| option.some(plain) -> { println(from_bytes(&plain)); }
| option.none -> { println("authentication failed"); };
sealed[0] := sealed[0] ^ 1;
match chacha20_poly1305_open(&key, &nonce, &header, &sealed) with
| option.some(_) -> { println("tampering missed"); }
| option.none -> { println("tampering detected"); };
return 0;
}
التشغيل
بالمفسر، دون ترجمة:
./build/sultanc run examples/ar/crypto/encryption.snأو ترجمه إلى ملف تنفيذي:
./build/sultanc examples/ar/crypto/encryption.sn -o build/example && ./build/example