Pythonda parol bilan matnni qanday shifrlash mumkin?

Bunga to'g'ridan-to'g'ri Google orqali javob topish qiyin.

1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc kabi salom dunyosi kabi foydalanuvchiga bir matnni va xabarni yig'ishni xohlayman.

Then I want to be able to encrypt/decrypt the message with the text somehow so that I can save it in my database and not worry about the data being exposed if my website gets hacked, encrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', 'hello world') decrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', )

Bunga python bilan erishishning oddiy usuli bormi va kimdir menga bir misolni etkazib berishi mumkin.

Ehtimol, '1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc' kabi urug'lardan foydalanib, ommaviy/xususiy kaliti juftlarini yaratishning misoli bormi?

Ko'p rahmat oldindan rahmat :)

EKRAN: Faqat aniq bo'lishi kerak. Foydalanuvchilar ma'lumotlarini shifrlash usulini izlay olmayman.

Agar bu PGP/GPG pub ​​/ pri kalit juftligini urug 'sifatida 1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc matnini ishlatishim kerak bo'lsa, unda bu yaxshi, ammo buni amalga oshirish usuli qanday?

4
Hatto aniq dublikat bo'lmasa ham, boshqa savolga foydali javoblar bor. Boshqa savolga bir nechta javob AES yoki DES kabi kuchli algoritmlardan foydalanadi. Bu savolning mohiyati xavfsizlikka emas, balki ojizlik emas (garchi OP OB-OB-OB-OB-OB-OB-OBRO'XONATNI O'RGANADI). Etarli javob, shifrlashning o'zi uchun pycrypto va ehtimol base64 ni ishlatish kabi ko'rinadi.
qo'shib qo'ydi muallif John Coleman, manba
@derrend: Aynan matnli matn bir xil shrift matn bloklari xaritasini bloklaydi, shuning uchun ECB pengueni .
qo'shib qo'ydi muallif user2357112, manba
@JohnColeman: Agar foydali qismlar bo'lsa ham, nima qilayotganingizni bilmasangiz ham, qaysi biri foydalidir va qanday qilib ularni to'g'ri ishlatishni bilib bo'lmaydi. DES buzilgan bo'lsa, yuqori AES javobiga ECB holati ishlatiladi va AES javob to'g'ri IV ishlamay qolgandan keyin javob beradi. Qabul qilingan javob asrlar davomida buzilgan va qo'l bilan sindirishi mumkin bo'lgan Vigenere shifrini ishlatadi.
qo'shib qo'ydi muallif user2357112, manba
"Mening foydalanuvchilar ma'lumotlarini muayyan usulda shifrlash" - xavfsiz emas. Agar bir xil matnli matnning har bir shifrlashi bir xil shrift matnini ishlab chiqaradigan bo'lsa, ma'lumotlar bazasidagi o'xshash fayllarni aniqlash juda oson bo'ladi.
qo'shib qo'ydi muallif user2357112, manba
@ user2357112 ECB rejimi bilan nima muammo bor?
qo'shib qo'ydi muallif derrend, manba
@JohnColeman yaqinroq tekshiruvda siz to'g'ri deb o'ylayman, rahmat :)
qo'shib qo'ydi muallif derrend, manba
@ user2357112 Har bir xabarni shifrlash uchun noyob matnni ishlataman, shuning uchun hech qanday o'xshash fayllar bo'lmaydi.
qo'shib qo'ydi muallif derrend, manba

6 javoblar

CBC rejimida, shu jumladan PKCS # 7 to'ldirish rejimida qanday qilib to'g'ri ishlash kerak:

import base64
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto import Random

def encrypt(key, source, encode=True):
    key = SHA256.new(key).digest()  # use SHA-256 over our key to get a proper-sized AES key
    IV = Random.new().read(AES.block_size)  # generate IV
    encryptor = AES.new(key, AES.MODE_CBC, IV)
    padding = AES.block_size - len(source) % AES.block_size  # calculate needed padding
    source += bytes([padding]) * padding  # Python 2.x: source += chr(padding) * padding
    data = IV + encryptor.encrypt(source)  # store the IV at the beginning and encrypt
    return base64.b64encode(data).decode("latin-1") if encode else data

def decrypt(key, source, decode=True):
    if decode:
        source = base64.b64decode(source.encode("latin-1"))
    key = SHA256.new(key).digest()  # use SHA-256 over our key to get a proper-sized AES key
    IV = source[:AES.block_size]  # extract the IV from the beginning
    decryptor = AES.new(key, AES.MODE_CBC, IV)
    data = decryptor.decrypt(source[AES.block_size:])  # decrypt
    padding = data[-1]  # pick the padding value from the end; Python 2.x: ord(data[-1])
    if data[-padding:] != bytes([padding]) * padding:  # Python 2.x: chr(padding) * padding
        raise ValueError("Invalid padding...")
    return data[:-padding]  # remove the padding

Belgilarni shifrlash yoki string parollarini ishlatmoqchi bo'lsangiz, ularni encode() yordamida ularni to'g'ri usulda o'tkazish uchun mos kodek bilan ishonch hosil qilish uchun bayt . kodlash parametrini encode () uchun encrypt() parametrini tark etsangiz, base64 kodlangan mag'lubiyatga ega bo'ladi va decrypt() Manba ham base64 string bo'lishi kerak.

Endi siz uni quyidagicha sinovdan o'tkazsangiz:

my_password = b"secret_AES_key_string_to_encrypt/decrypt_with"
my_data = b"input_string_to_encrypt/decrypt"

print("key:  {}".format(my_password))
print("data: {}".format(my_data))
encrypted = encrypt(my_password, my_data)
print("\nenc:  {}".format(encrypted))
decrypted = decrypt(my_password, encrypted)
print("dec:  {}".format(decrypted))
print("\ndata match: {}".format(my_data == decrypted))
print("\nSecond round....")
encrypted = encrypt(my_password, my_data)
print("\nenc:  {}".format(encrypted))
decrypted = decrypt(my_password, encrypted)
print("dec:  {}".format(decrypted))
print("\ndata match: {}".format(my_data == decrypted))

Sizning chiqishingiz quyidagicha bo'ladi:

key:  b'secret_AES_key_string_to_encrypt/decrypt_with'
data: b'input_string_to_encrypt/decrypt'

enc:  7roSO+P/4eYdyhCbZmraVfc305g5P8VhDBOUDGrXmHw8h5ISsS3aPTGfsTSqn9f5
dec:  b'input_string_to_encrypt/decrypt'

data match: True

Second round....

enc:  BQm8FeoPx1H+bztlZJYZH9foI+IKAorCXRsMjbiYQkqLWbGU3NU50OsR+L9Nuqm6
dec:  b'input_string_to_encrypt/decrypt'

data match: True

Xuddi shu kalit va bir xil ma'lumotlarning har doim turli xil shifrlarni matnini ishlab chiqarishni isbotlash.

Endi bu ECBdan ko'ra yaxshiroqdir, lekin ... agar siz bu aloqada foydalanmoqchi bo'lsangiz - buni qilmang! Bu, qanday qilib ishlab chiqarilishi kerakligini tushuntirish uchun ko'proq ishlab chiqarish muhitida va ayniqsa aloqa uchun emas, balki juda muhim tarkibiy qismini - xabarni autentifikatsiya qilishda foydalanmaslikdir. U bilan o'ynashni xohlaysiz, lekin siz o'z shifrlamangizni yoyishingiz kerak emas, sizda umumiy tuzoqlardan qochishingizga yordam beradigan yaxshi tasdiqlangan protokollar mavjud va ulardan foydalanishingiz kerak.

11
qo'shib qo'ydi
Ogohlantirish : SHAni kalit uchun derivat usuli (KBKDF) sifatida ishlatish, juda yuqori miqdorda entropiya bilan kirish satrlari uchun yaxshi, ammo oddiy parollar yoki so'z birikmalar uchun emas. CBC saqlangan joyda saqlash uchun yaxshi (masalan, ma'lumotlar bazasida), lekin transport rejimida xavfsizlik uchun emas. : Buning o'rniga TLS-ga tayanish.
qo'shib qo'ydi muallif Maarten Bodewes, manba
Bu narsa aniq emas - bu sizning arizangizga bog'liq. TLS bilan bog'lanishni istasangiz, deyarli barcha protokollardan (TLS faqat transport katmanında foydalanish shart emas) deyarli barcha uchun juda kuchli va OpenSSL . Agar sizning eng yaxshi pul tikishingiz aniq bo'lmasa, siz shifrlash haqida savol berishingiz mumkin va odamlar kriptografiya yo'lida qandaydir nurni yoritishi kerak :)
qo'shib qo'ydi muallif zwer, manba
@TessellatingHeckler - ha, CBCga bunga ehtiyoj bor, va u tasodifiy va noyob bo'lmasa (ishlatiladigan kalitga) CBC ko'plab hujumlarga moyil bo'ladi. Damonning fikrlariga kelsak, u nima haqida gapirayotganini bilmasligini aytadi - CBC rejimida IV XORga birinchi "to'g'ri matn" blokini ishlatadi va agar siz birinchi blokni siz boshqa ma'lumotni topa olmaysiz - demak, siz IVni shifrlashingiz kerak bo'lsa, uni parolini yo'qotishning hech qanday usuli yo'q. Sizning IV-ni sindirishning bir yo'li bor, lekin bu sharh bo'limining hajmidan oshib ketadi va bundan tashqari, buni amalga oshirish uchun hech qanday sabab yo'q.
qo'shib qo'ydi muallif zwer, manba
@joanlofe - u holda, Python 2.x modsida uni hisobga olishni unutib qo'ysangiz, uni qo'lga olishingiz uchun rahmat.
qo'shib qo'ydi muallif zwer, manba
Sharhlarda bu erda - security.stackexchange.com/q/17044/1427 - Damon IV shifrlashdan oldin to'g'ri matn bilan birlashtirildi. Faqat KeyWrap/ECBni parolini bekor qildim, buning uchun parolni bekor qilish uchun IV kerak edi; CBC rejimi aslida bunga muhtojmi? Chunki bu erda @derrend bir xil matnni qayta-qayta takrorlashni istaydi, shuning uchun birinchi blokni IV birinchi blok sifatida ishlatish uchun argument har doim o'zimning kriptografik bo'lmagan quloqlarimga yaxshi ta'sir qiladi, lekin ... shundaymi?
qo'shib qo'ydi muallif TessellatingHeckler, manba
Bu ajoyib echim bo'lishi mumkin, ammo bu juda murakkab ko'rinishga ega. cryptography kutubxonasini ishlatmaslik uchun hech qanday sabab ko'rmayapman ( cryptography.io/en/latest ) bir kod satrida shifrlangan/parolini chiqaradi. To'plam statik ravishda bog'langan, shuning uchun barcha bog'liqliklar kiritilgan.
qo'shib qo'ydi muallif expz, manba
Kod men uchun ishlamasa, unda kodni ochishda TypeError: unary -: 'str' istisno qilinsin. Biznes padding = data [-1] o'rniga padding = ord (data [-1]) qo'yishdir.
qo'shib qo'ydi muallif joanlofe, manba
"Sizda umumiy tuzoqlardan qochishingizga yordam beradigan yaxshi tasdiqlangan protokollar mavjud va siz ulardan foydalanmoqchimisiz, buning uchun oddiyroq/yanada mustahkam usul bormi? Agar shunday bo'lsa, iltimos meni bog'lashi mumkinmi?
qo'shib qo'ydi muallif derrend, manba

Mana, qiziqish bildiradigan har bir kishi uchun mening yechimim:

from Crypto.Cipher import AES  # pip install pycrypto
import base64

def cypher_aes(secret_key, msg_text, encrypt=True):
    # an AES key must be either 16, 24, or 32 bytes long
    # in this case we make sure the key is 32 bytes long by adding padding and/or slicing if necessary
    remainder = len(secret_key) % 16
    modified_key = secret_key.ljust(len(secret_key) + (16 - remainder))[:32]
    print(modified_key)

    # input strings must be a multiple of 16 in length
    # we achieve this by adding padding if necessary
    remainder = len(msg_text) % 16
    modified_text = msg_text.ljust(len(msg_text) + (16 - remainder))
    print(modified_text)

    cipher = AES.new(modified_key, AES.MODE_ECB)  # use of ECB mode in enterprise environments is very much frowned upon

    if encrypt:
        return base64.b64encode(cipher.encrypt(modified_text)).strip()

    return cipher.decrypt(base64.b64decode(modified_text)).strip()


encrypted = cypher_aes(b'secret_AES_key_string_to_encrypt/decrypt_with', b'input_string_to_encrypt/decrypt', encrypt=True)
print(encrypted)
print()
print(cypher_aes(b'secret_AES_key_string_to_encrypt/decrypt_with', encrypted, encrypt=False))

Natija:

b'secret_AES_key_string_to_encrypt'
b'input_string_to_encrypt/decrypt '
b'+IFU4e4rFWEkUlOU6sd+y8JKyyRdRbPoT/FvDBCFeuY='

b'secret_AES_key_string_to_encrypt'
b'+IFU4e4rFWEkUlOU6sd+y8JKyyRdRbPoT/FvDBCFeuY=    '
b'input_string_to_encrypt/decrypt'
1
qo'shib qo'ydi
@TessellatingHeckler - KeyWrap hech qachon bir xil blokni shifrlamaydi yoki bir nechta bloklardan bir xil kalitni ishlatmaydi, shuning uchun ECB bu erda mukammal darajada yaxshi - lekin umumiy kodlash uchun ECB rejimi sifatida ECB yaxshi fikrdir. Bundan tashqari siz ECB o'rniga "Joe" deb atashingiz mumkin, chunki u blok zanjirlari uchun odatiy ish rejimiga ishora qiladi va u hech qachon yo'qolmaydi - ammo kutubxona yaratuvchilari uni so'nggi foydalanuvchilari tomonidan yanada qiyinlashtirmoqchi. bu bilan noto'g'ri borish oson.
qo'shib qo'ydi muallif zwer, manba
Yo'q, bayt turi (Python 2.x da str ) oldida "b" ni chizishingiz kerak emas - bu ikkilik ma'lumotni shu tarzda yomon ifodalashingiz mumkin - kodni kodlash ()/decode() belgilarini baytlarga aylantirganda yoki aksincha. Kodni biroz yangilagandim, shunda endi encrypt() bir qatorni ishlab chiqaradi va decrypt() bir qatorni kutishadi, ammo kutish kerak kalit va ma'lumotlarning baytlari. Agar string-faqat ma'lumotlar bilan ishlayotgan bo'lsa, buni qanday qilish kerakligi haqida ogohlantirish ham mavjud.
qo'shib qo'ydi muallif zwer, manba
Men shu vaqtning o'zida juda soddalashtirdim - chunki siz barcha ma'lumotlarga ega bo'lishingiz kerak, chunki ma'lumotlar oqim bilan ishlashga hojat yo'q, shuning uchun har bir narsani oddiy kesish orqali amalga oshirish mumkin ...
qo'shib qo'ydi muallif zwer, manba
u erda siz kodni biroz tozalashdan foydalanishingiz mumkin, chunki boshqa savolning OP kodidan hali ham noaniq tuzilmalar mavjud ...
qo'shib qo'ydi muallif zwer, manba
Ayniqsa, tajovuzkorning solishtirish uchun oddiy matnli ma'lumotlarga kirish imkoni bo'lsa, turli xil ma'lumotlar va/yoki ma'lumotlar bloklarini bir xil kalitdan foydalanganda ancha oson bo'lar edi. Texnik jihatdan ECBni xavfsiz usulda qo'llash mumkin bo'lsa-da, bunga qaraganda ko'proq muammo - ECB methga o'xshaydi, hatto bir marta!
qo'shib qo'ydi muallif zwer, manba
Btv. CBC-ni qanday qilib ishlatish kerak (fayllar ustida, lekin fayllar oqimini olib tashlang va xotirada shifrlash uchun bir xil kodni ishlatishingiz mumkin): stackoverflow.com/a/44126075/7553525
qo'shib qo'ydi muallif zwer, manba
ECB rejimidan foydalanmang. Hech qachon! U korporativ muhitda qovurilgan emas, u sizning xavfsizligingizni xohlagan joyingizga tushib ketgan. ECB juda ko'p ma'lumotni sızdırıyor va shu qadar ko'p hujumlarga moyil bo'ladi, albatta, ba'zi kutubxonalar, hatto, bu variantni ham o'z ichiga olmaydi.
qo'shib qo'ydi muallif zwer, manba
@zwer - AES KeyWrap ECB dan foydalanadi - tools.ietf.org/html/rfc5649 - bo'lim 4.1 . 2) shunday deydi. AES KeyWrap qoshilib qoldimi? Apple tomonidan iOS qurilmalari va LUKS va TrueCrypt orqali fayl tizimlarini shifrlash uchun kalitlarni himoya qilish uchun foydalaniladi - security.stackexchange.com/a/40073/1427 izohlar.
qo'shib qo'ydi muallif TessellatingHeckler, manba
Shukurni bilish yaxshi. 21 soat ichida o'zingizning yutug'ingiz ko'rinadi;)
qo'shib qo'ydi muallif derrend, manba
Yana minnatdorchilik bildiring. Faqat tez so'raladigan bo'lsak, siz kodlashni() va kodni() ishlatish haqida eslatib o'tmoqchisiz, lekin men "b" harflarini oldida tashlayman va u yaxshi ishlaydigan ko'rinadi. Bu yaxshi emasmi?
qo'shib qo'ydi muallif derrend, manba
@zwer juda minnatdor, kodni ko'rib chiqaman va tezda mukofotingizni beraman, rahmat :)
qo'shib qo'ydi muallif derrend, manba
@zwer har doim turli xil kalit bo'lsa-da, lekin ba'zi hollarda shifrlangan matn bo'lishi mumkin, ehtimol yuzlab marta: /
qo'shib qo'ydi muallif derrend, manba
@zwer Men python mutaxassisi emasman, siz CBC yordamida bir xil narsaga erishish uchun o'zgartirilgan namunani taqdim qilasizmi? Men juda minnatdorman :) Sizga 100 ta obro'yini to'layman.
qo'shib qo'ydi muallif derrend, manba

Buni standart Python kutubxonasidagi ichki funksiyalarning ikkitasidan foydalansangiz bo'ladi. Birinchisi, ord() funktsiyasi bo'lib, unicode string belgilarini bitta kirish parametri sifatida oladi va uni tegishli unicode kodiga (butun son) o'zgartiradi. Ushbu funktsiyani ishlatishning ikkita oddiy misoli berilgan:

>>> ord('a')
    97

>>> ord('b')
    98

Keyin, shuningdek, ord() ning teskari vazifasini ham bor: chr() . Va siz tasavvur qilishingiz mumkinki, u butun ish bilan ishlaydi: unikod kodi kirish (tamsayt) ga ega va unikod belgilarini (string) oladi:

>>> chr(97)
    'a'

>>> chr(98)
    'b'

Keyin ba'zi oddiy tasnifni qo'shib yoki ba'zi bir tasodifiy tamsayish bilan qo'shib qo'yishingiz mumkin ... bu holatda, 2-son:

QAYD: Juda katta qadriyatlarga ega emasligingizni ko'rib chiqing yoki siz noto'g'ri identifikatorga ega bo'lgan xato idiga ega bo'lasiz, masalan.

def encrypt(message):
    newS=''
    for car in message:
        newS=newS+chr(ord(car)+2)
    return newS


print(encrypt('hello world'))

Natijada:

jgnnq"yqtnf

Endi siz xuddi shu funktsiyani nusxalashingiz va o'chirishingiz va parolni hal qilish funktsiyasini yaratishingiz mumkin. Bunday holda, aniqki, 2:

def decrypt(message):
    newS=''
    for car in message:
        newS=newS+chr(ord(car)-2)
    return newS


print(decrypt('jgnnq"yqtnf'))

Natijada yana asl xabar bo'ladi:

'hello world'

Bu dasturni programmatchilarga shifrlashning ajoyib usuli bo'ladi. Ammo, dasturiy bilimlardan ozgina kimsa kodni shifrlash uchun unikod belgilarga qo'shdik (2) topdikigacha biz ishlatgan tamsayıni o'zgartiradigan dastur yozish mumkin ...

Bunga yo'l qo'ymaslik uchun men yana ikkita murakkab variantni taklif qilaman.

1. The first one is the simplest: it consists in applying a different sum value to the chr function depending on the position of the character (for example, adding 2 to each unicode code when it occupies an even position in the string and substracting 3 when sits on an odd position).

2. The second one will generate the maximum security. It will consist on adding or substracting every unicode code for a number that will be randomly generated for each character. It will require to store an array of values to decript back the message. Make sure, then, this array of values is not available to third parties.

Bu erda 1 uchun mumkin bo'lgan echim bor.

def encryptHard(message):
newS=''
for i in range(len(message)):
  if i%2==0:
    newS=newS+chr(ord(message[i])+2)
  else:
    newS=newS+chr(ord(message[i])-3)
return newS


print(encryptHard('hello world'))

Natijada quyidagilar bo'ladi:

jbniqyltif

Shu bilan birga, parolni dekriptlash ssenariysi oshkor qilinadigan ma'lumot bilan ochiq, shuning uchun men sizni ikki xil qadriyatni engish, pasaytirish va almashtirish bilan bezovta qilmayman.

Nihoyat, keling ikkinchi kompleks alternativni chuqur tahlil qilaylik. Buning yordamida biz bu yozilish deyarli noma'qul deb aytishimiz mumkin. Bizning fikrimiz, biz qo'shgan qiymatni yoki har bir unicode kodiga tasodifiy tasodifiy son bilan 0 va 255 orasida (bu chr() funktsiyasi tanlagan raqamlar oralig'i bilan farqlanadi, shuning uchun boshqa raqamlar bilan o'ynashga harakat qilmang albatta xato qilishingiz mumkin).

Bunday holda, mening taklifim ham operatsiyani tasodifiy (summa yoki chiqarib tashlash) va oxirgi sonning 0 bo'lishini oldini oladi (ya'ni biz original belgini olamiz). Va nihoyat, u ham chiqarilgan raqamlar bilan ro'yxatni qaytaradi, xabarni parolini hal qilish uchun sizga kerak bo'ladi.

n uzunligi bilan bir xil xabarni ikki marta ishlatsangiz, xuddi shu shifrlangan xabarni olish imkoniyati 255 ^ n ga yaqinroqdir ... Shunday qilib, Xavotir olmang (men biroz gapiryapman, chunki yaratilgan algoritm, aslida, past yoki yuqori darajali qadriyatlar oralig'ida takroriy qadriyatlar yaratadi, masalan, eng tez-tez uchraydigan belgilar bu taqsimotda unikodli karakola to'siqlariga emas, 0 dan 255 gacha), ammo dastur mukammal bo'lmasa-da, mukammal ishlaydi va ma'lumotni himoya qiladi.

import random as r
def encryptSuperHard(message):
  newS=''
  l_trans=[]
  for car in message:
    code=ord(car)
    add_subtract=r.choice([True,False])
    if add_subtract:
      transpose=r.randint(0,code-1)
      newS=newS+chr(code-transpose)
      l_trans=l_trans+[-transpose]
    else:
      transpose=r.randint(code+1,255)
      newS=newS+chr(code+transpose)
      l_trans=l_trans+[transpose]
  return newS, l_trans

print(encryptSuperHard('hello world'))

Bu holda, men yaratgan bu tasodifiy shifrlash skripti bu ikki qiymati tupleni qaytarib berdi, bu erda birinchi qiymat shifrlangan xabar, ikkinchisi esa har bir belgining apearance tartibiga ko'ra "transposed" bo'lgan qiymati.

('A0ŤłY\x10řG;,à', [-39, -53, 248, 214, -22, -16,     226, -40, -55, -64, 124])

Shifrlashni, bu holda shifrlangan xabarni va ro'yxatni qabul qilish va quyidagilarni bajarish kerak bo'ladi:

def decryptSuperHard(encriptedS,l):
  newS=''
  for i in range(len(l)):
    newS=newS+chr(ord(encriptedS[i])-l[i])
  return newS

print(decryptSuperHard('A0ŤłY\x10řG;,à', [-39,-53,248,214,-22,-16,226,-40,-55,-64,124]))

Va natijalar quyidagicha bo'ladi:

salom dunyo

print(deccryptSuperHard('A0ŤłY\x10řG;,à', [-39, -53, 248, 214, -22, -16,     226, -40, -55, -64, 124])
1
qo'shib qo'ydi
Tabriklayman, faqat 2 mingyildan keyin Tsezar shifrini topdingiz.
qo'shib qo'ydi muallif zwer, manba
-1, bu juda xavfsiz emas. Eng muhimi, bu "shifrlash" algoritmida ishlatiladigan narsalarni qayta ishlash va buzib tashlash uchun 15 daqiqadan ko'proq vaqt talab etiladi.
qo'shib qo'ydi muallif Matt Messersmith, manba
Bu javobni yaratish uchun ketgan vaqtingizni va muammoingizni qadrlayman, lekin bu mening asl savolimga dahshatli va jiddiy xavfli echim bo'lishi mumkinligiga ishonch hosil qilaman, masalan matnni tushunish uchun kerakli qadriyatlarni saqlash kerak haqiqiy emas va undan keyingi asoratlarni keltirib chiqaradi. Tanish bo'lsangiz ham rahmat :)
qo'shib qo'ydi muallif derrend, manba
@endrend, xush kelibsiz. Kechirasiz, men keladigan murakkab echimning imkoni yo'q. Men kompyuter mutaxassisi yoki kiberxavfsizlik mutaxassisi emasman, lekin bu ba'zi fikrlarni keltirib chiqarishi mumkin deb o'ylardim. O'qish vaqtingiz uchun rahmat, men buni o'ylardim!
qo'shib qo'ydi muallif americansanti, manba
alpha = "abcdefghijklmnopqrstuvwxyz"
password = input("What is the password?:")
password = "".join([(str(ord(x)-96) if x.isalpha() else x) for x in list(password)])
password = int(password)

def encrypt(cleartext):
  cyphertext = ""
  for char in cleartext:
    if char in alpha:
      newpos = (alpha.find(char) + password) % 26
      cyphertext += alpha[newpos]
    else:
      cyphertext += char

  return cyphertext

def decrypt(cleartext):
  cyphertext = ""
  for char in cleartext:
    if char in alpha:
      newpos = (alpha.find(char) - password) % 26
      cyphertext += alpha[newpos]
    else:
      cyphertext += char

  return cyphertext

while True:
  cleartext = input("Cleartext:")
  cleartext = cleartext.lower()
  print(encrypt(cleartext))

  cleartext = input("Cyphertext:")
  cleartext = cleartext.lower()
  print(decrypt(cleartext))

Shunday qilib, men buni qilaman!

1
qo'shib qo'ydi
Bu ma'ruf matnni qoralashi mumkin, lekin kriptografik jihatdan xavfsiz emas. Siz o'zingizning kriptoingizni yugurishdan qochishga harakat qilishingiz kerak, nima uchun bu ajoyib fikr emasligini ko'ring Crypto kabi kutubxonani ishlatish o'rniga, "nima uchun biz o'zimizni silamasligimiz kerak?"> security.stackexchange.com/questions/18197/…
qo'shib qo'ydi muallif ktzr, manba
  1. Foydalanuvchilarga ruxsat berish uchun yuqorida ko'rsatilgan ma'lumotlar bazasidan foydalanmoqchi bo'lsangiz, hashes yoki ikki tomonlama shifrlash algoritmlari o'rniga foydalanuvchi parollarini xabardor qilish, bu sizning ma'lumotlaringizni db oqimida ham ishlatishni qiyinlashtiradi.
  2. Yuqoridagi usuldan ba'zi bir nuqtada parol hal qilinishi kerak bo'lgan ma'lumotlarni himoya qilish uchun foydalana olmaysiz, lekin hatto ba'zi bir sobit kalitlardan foydalanib (bu eng yomon usul) foydalanuvchi parollarini shifrlashdan ko'ra xavfsizroq usuldan foydalanishingiz mumkin. OWASP ning Parolni saqlashni tekshirish sahifasiga qarang.

"Xabarni shifrlash/shifrlashni xohlayman" deb yozganingizdek, Blowfish-dan foydalanib, oddiy python manbai (2,7 tagacha sinovdan o'tgandim).

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import os
from Crypto.Cipher import Blowfish     # pip install pycrypto

BS = 8
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
unpad = lambda s : s[0:-ord(s[-1])]

def doEncrypt(phrase, key):
    c1  = Blowfish.new(key, Blowfish.MODE_ECB)
    return c1.encrypt(pad(phrase))

def doDecrypt(phrase, key):
    c1  = Blowfish.new(key, Blowfish.MODE_ECB)
    return unpad(c1.decrypt(phrase))

def testing123(phrase, key):
    encrypted = doEncrypt(phrase, key)
    decrypted = doDecrypt(encrypted, key)
    assert phrase == decrypted, "Blowfish ECB enc/dec verification failed"
    print ("Blowfish ECB enc/dec verified ok")
    print ('phrase/key(hex)/enc+dec: {}/{}/{}'.format(phrase, key.encode('hex'), decrypted))

if __name__== "__main__":
    phrase= 'Ala ma kota, a kot ma AIDS.'
    key= os.urandom(32)
    testing123(phrase, key)
0
qo'shib qo'ydi
ECB? Blowfish? Xatarli!
qo'shib qo'ydi muallif Maarten Bodewes, manba

Zauaning javoblariga asoslanib, manba to'liq 16 sonli bo'lsa, biroz xato qiladi.

Kod:

from builtins import bytes
import base64
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto import Random

def encrypt(string, password):
    """
    It returns an encrypted string which can be decrypted just by the 
    password.
    """
    key = password_to_key(password)
    IV = make_initialization_vector()
    encryptor = AES.new(key, AES.MODE_CBC, IV)

    # store the IV at the beginning and encrypt
    return IV + encryptor.encrypt(pad_string(string))

def decrypt(string, password):
    key = password_to_key(password)   

    # extract the IV from the beginning
    IV = string[:AES.block_size]  
    decryptor = AES.new(key, AES.MODE_CBC, IV)

    string = decryptor.decrypt(string[AES.block_size:])
    return unpad_string(string)

def password_to_key(password):
    """
    Use SHA-256 over our password to get a proper-sized AES key.
    This hashes our password into a 256 bit string. 
    """
    return SHA256.new(password).digest()

def make_initialization_vector():
    """
    An initialization vector (IV) is a fixed-size input to a cryptographic
    primitive that is typically required to be random or pseudorandom.
    Randomization is crucial for encryption schemes to achieve semantic 
    security, a property whereby repeated usage of the scheme under the 
    same key does not allow an attacker to infer relationships 
    between segments of the encrypted message.
    """
    return Random.new().read(AES.block_size)

def pad_string(string, chunk_size=AES.block_size):
    """
    Pad string the peculirarity that uses the first byte
    is used to store how much padding is applied
    """
    assert chunk_size  <= 256, 'We are using one byte to represent padding'
    to_pad = (chunk_size - (len(string) + 1)) % chunk_size
    return bytes([to_pad]) + string + bytes([0] * to_pad)
def unpad_string(string):
    to_pad = string[0]
    return string[1:-to_pad]

def encode(string):
    """
    Base64 encoding schemes are commonly used when there is a need to encode 
    binary data that needs be stored and transferred over media that are 
    designed to deal with textual data.
    This is to ensure that the data remains intact without 
    modification during transport.
    """
    return base64.b64encode(string).decode("latin-1")

def decode(string):
    return base64.b64decode(string.encode("latin-1"))

Sinovlar:

def random_text(length):
    def rand_lower():
        return chr(randint(ord('a'), ord('z')))
    string = ''.join([rand_lower() for _ in range(length)])
    return bytes(string, encoding='utf-8')

def test_encoding():
    string = random_text(100)
    assert encode(string) != string
    assert decode(encode(string)) == string

def test_padding():
    assert len(pad_string(random_text(14))) == 16
    assert len(pad_string(random_text(15))) == 16
    assert len(pad_string(random_text(16))) == 32

def test_encryption():
    string = random_text(100)
    password = random_text(20)
    assert encrypt(string, password) != string
    assert decrypt(encrypt(string, password), password) == string
0
qo'shib qo'ydi
@endrend - kechikish uchun uzr so'rayman, shuning uchun sizning sharhingiz haqida menga xabar bera olmadi va men buni faqatgina eslayman. Masalan, manba kattaligiga oid misolda xato yo'q - bu AES.block_size ko'paytmasi bo'lganida, AES.block_size kodini PKCS # 7 to'ldirishni spesifikasyon ga ko'ra. Shu bilan birga, AES.block_size - 1 (barcha ichida 15 bayt) uchun Ignacio ning (chunk_size - (len (string) + 1))% chunk_size bu hajmni manbalari uchun shifrlash/parolni hal qilish jarayonini sinadi.
qo'shib qo'ydi muallif zwer, manba
Sizning javob og'ayni uchun rahmat :) @zwer Agar bu yangi javob, albatta, manbai 16 ning ko'paytmasi bo'lgan avvalgi javob va qopqoqni foydalanish ishlari bo'yicha yaxshilash bo'lsa ko'rib, bir zum olib, aytarsiz iltimos qilaman? Rahmat :)
qo'shib qo'ydi muallif derrend, manba
Sizga katta minnatdorchilik bildiraman, javob va tushuntirish uchun juda minnatdorman :) Ignacio, sizning harakatingiz hali ham juda qadrlanadi.
qo'shib qo'ydi muallif derrend, manba
Rahmat, muammoni hal qildi. Javobni yangilashimni xohlaysizmi, menga xabar bering.
qo'shib qo'ydi muallif Ignacio Tartavull, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming