BOUNCY CASTLE da AES / CBC / PKCS7Padding shifrlash
Quyida biz xabarni AES algoritmi bilan shifrlashni yozishga, shuningdek unga SHA512 algoritmi haqida raqamli imzo qo'shishga harakat qilamiz.
Avvalo, yangi Maven loyihasini yaratib, "pom.xml" fayliga bog'liqlik qo'shaylik:
org.bouncycastle
bcprov-jdk16
1.46
AESEngine nusxasini yaratamiz:
Hozircha hamma narsa oddiy. Ammo siz shunchaki AES dan foydalana olmaysiz. Shifrlash blokirovkalash rejimidan foydalanishimiz kerak, shunda keyingi blokning shifrlash natijasi oldingisining shifrlash natijasiga bog'liq bo'ladi. Bunday taktika tajovuzkorning o'rtaga qo'shimcha bloklar qo'yishiga to'sqinlik qiladi, shuningdek, bizning barcha harakatlarimizga putur etkazishi mumkin bo'lgan shifrlangan matnda keng tarqalgan iboralarni topishni qiyinlashtiradi. Cipher Block Chaining biz uchun CBCBlockCipher class ni amalga oshiradi:
Endi yana bitta muammoni hal qilishimiz kerak. AES va CBC bloklarda ishlaydi. Ixtiyoriy uzunlikdagi satrlarni uzatmoqdamiz. Agar biz uzatayotgan satrninfg kattaligini blok kattaligiga qoldiqsiz bo'lish mumkin bo'lmasa-chi? Blok o'lchamidan kichikroq qolgan dumni qanday o'tkazaman? Buning uchun to'ldirish yoki padding, ya'ni xabar oxiriga qo'shilgan qo'shimcha ma'lumotlar ishlatiladi. Biz PKCS7 padding vositasidan foydalanamiz:
SHA512 yordamida shifrlangan xabarlarni imzolaymiz:
AES va SHA512 algoritmlari biz o'z kodimizga baytlar qatorida o'tadigan kalitlardan foydalanadi:
HMac nusxasiga kalit berilishi kerak:
Shuningdek, biz boshlang'ich vektori (Initialization Vector yoki IV) kerak - bu tasodifiy raqam, u kalit bilan birga shifrlash va parolni hal qilish algoritmida ishlatiladi. Har bir yangi xabar turli xil IVga ega bo'ladi, bu sizga xabarlarning bir xil qismlari uchun ham turli xil shifrlash natijalarini yaratishga imkon beradi. Biz etkazilgan xabarlar, masalan, odamlarning ismlari, salomlashish yoki boshqa biron bir narsani takrorlashi mumkinligini tushunamiz. IV tufayli shifrlash turli xil xabarlarda takrorlanadigan matn qismlari uchun turli xil natijalarni beradi:
E'tibor bering, biz IV ishlab chiqarish uchun odatiy Random emas, balki SecureRandomdan foydalanganmiz. Normal Random kriptografik tasodifiy sonlarni yaratish uchun mos emas.
Shifrni kalitlarga va IV-ga o'tkazib, uni ishga tushiramiz:
IV ni yashirish shart emas. Qabul qiluvchiga shifrlangan xabarning birinchi bloki sifatida yuborilishi mumkin va aniq matnda IV da hech qanday sir yo'q:
Keyin hamma narsa oddiy. Biz cipher.processBytes va hmac.update ni chaqiramiz, ularga asl xabardan o'qilgan bayt bloklarini uzatamiz va nihoyat oxirgi blokni hisoblash va yozish uchun cipher.doFinal-ga, shuningdek imzoni hisoblash uchun hmac.doFinal-ga murojat qilamiz:
Va eng muhimi! Oxir-oqibat, biz foydalanishda RAM-da shaxsiy ma'lumotlar va kalitlarga ega bo'lmasliklari uchun jarayonda ishlatiladigan barcha baytli qatorlarni nollar bilan to'ldiramiz:
Yakuniy natija:
|