একটি পাসওয়ার্ড অনুযায়ী স্ট্রিং এনকোড করার সহজ উপায়?


122

পাইথনের কি পাসওয়ার্ড ব্যবহার করে এনকোডিং / ডিকোডিংয়ের স্ট্রিংগুলি অন্তর্নির্মিত, সহজ উপায় রয়েছে?

এটার মতো কিছু:

>>> encode('John Doe', password = 'mypass')
'sjkl28cn2sx0'
>>> decode('sjkl28cn2sx0', password = 'mypass')
'John Doe'

সুতরাং স্ট্রিং "জন দো" 'sjkl28cn2sx0' হিসাবে এনক্রিপ্ট হয়েছে। আসল স্ট্রিংটি পেতে, আমি 'মাইপাস' কীটি দিয়ে সেই স্ট্রিংটিকে "আনলক" করব যা আমার উত্স কোডের একটি পাসওয়ার্ড। আমি পাসওয়ার্ডের সাহায্যে কোনও ওয়ার্ড ডকুমেন্ট এনক্রিপ্ট / ডিক্রিপ্ট করতে পারি this

আমি এই এনক্রিপ্ট করা স্ট্রিংগুলি ইউআরএল প্যারামিটার হিসাবে ব্যবহার করতে চাই। আমার লক্ষ্য নিস্পত্তি, শক্তিশালী সুরক্ষা নয়; কোন মিশন সমালোচনা এনকোড করা হচ্ছে না। আমি বুঝতে পারি কী এবং মানগুলি সংরক্ষণ করার জন্য আমি একটি ডাটাবেস টেবিল ব্যবহার করতে পারি, তবে সংক্ষিপ্তবাদী হওয়ার চেষ্টা করছি।


28
এখানে "পাসওয়ার্ড" শব্দটি অনুপযুক্ত। আপনি এটিকে একটি ক্রিপ্টোগ্রাফিক কেইওয়াই হিসাবে ব্যবহার করছেন এবং আপনার প্রশ্নগুলির পাশাপাশি কোনও ডক্স, মন্তব্য, চশমা, পরীক্ষার পরিকল্পনা ইত্যাদিতে বিভ্রান্তি এড়াতে আপনার সেই পরিভাষাটি ব্যবহার করা উচিত
জিম ডেনিস

2
"আমি পাসওয়ার্ড দিয়ে ওয়ার্ড ডকুমেন্টটি এনক্রিপ্ট / ডিক্রিপ্ট করতে পারি সেভাবেই এটি হতে চাই" ", ওয়ার্ডের ইতিমধ্যে আপনার ডকুমেন্টগুলি এনক্রিপ্ট করার জন্য একটি বিল্ট ইন বিকল্প রয়েছে যদি আপনার কেবলমাত্র শব্দ নথি এনক্রিপ্ট করতে হয়।
বায়রন ফাইলার

2
মজার ব্যাপার হচ্ছে, অনুযায়ী এই গবেষণা কাগজ পাসওয়ার্ড স্টোরেজ ফাঁদ উপর ভালো , ডেভেলপারদের যারা স্ট্যাক ওভারফ্লো কম নিরাপদ কোড উত্পাদন করতে থাকে। জি, আমি ভাবছি কেন?
বন

এছাড়াও, সুরক্ষা
এসই

কেউ কেবল সহজেই এনকোডিং / ডিকোডিং কার্যকর করে না
ভাগ্যবান 3

উত্তর:


70

ধরে নিই যে আপনি কেবল সাধারণ অবলোকনটির সন্ধান করছেন যা খুব নৈমিত্তিক পর্যবেক্ষকের কাছ থেকে জিনিসগুলিকে অস্পষ্ট করবে এবং আপনি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করছেন না। আমি ভিগনির সিফারের মতো কিছু প্রস্তাব দেব। এটি সাধারণ প্রাচীন সাইফারগুলির মধ্যে অন্যতম শক্তিশালী।

ভিজেনের সাইফার

এটি দ্রুত এবং কার্যকর করা সহজ। কিছুটা এইরকম:

import base64

def encode(key, string):
    encoded_chars = []
    for i in xrange(len(string)):
        key_c = key[i % len(key)]
        encoded_c = chr(ord(string[i]) + ord(key_c) % 256)
        encoded_chars.append(encoded_c)
    encoded_string = "".join(encoded_chars)
    return base64.urlsafe_b64encode(encoded_string)

আপনি কীটি বিয়োগ ব্যতীত ডিকোডটি বেশ একইরকম।

আপনার এনকোডিং করা স্ট্রিংগুলি সংক্ষিপ্ত থাকলে এবং / অথবা ব্যবহৃত পাসফ্রেজের দৈর্ঘ্য অনুমান করা যদি শক্ত হয় তবে এটি ভাঙ্গা অনেক কঠিন।

আপনি যদি ক্রিপ্টোগ্রাফিক কিছু খুঁজছেন, পাইক্রিপ্টো সম্ভবত আপনার সেরা বাজি, যদিও পূর্ববর্তী উত্তরগুলি কিছু বিবরণ উপেক্ষা করে: পাইক্রিপ্টোতে ইসিবি মোডে আপনার বার্তাটির দৈর্ঘ্য 16 টি অক্ষরের একাধিক হতে হবে। সুতরাং, আপনি প্যাড করা আবশ্যক। এছাড়াও, আপনি যদি তাদের ইউআরএল প্যারামিটার হিসাবে ব্যবহার করতে চান তবে base64.urlsafe_b64_encode()মানকটির চেয়ে ব্যবহার করুন । এটি বেস -64 বর্ণমালার কয়েকটি অক্ষরের পরিবর্তে ইউআরএল-সুরক্ষিত অক্ষর (যেমন নামটি বোঝায়) দিয়ে প্রতিস্থাপন করে।

যাইহোক, আপনি একেবারে নির্দিষ্ট যে এই হওয়া উচিত খুব কিংকর্তব্যবিমূঢ়তা এর পাতলা স্তর এই ব্যবহার করার পূর্বে আপনার প্রয়োজনের জন্য যথেষ্ট। আমি লিপিবদ্ধ উইকিপিডিয়া নিবন্ধটি সাইফারটি ভাঙ্গার জন্য বিশদ নির্দেশাবলীর সরবরাহ করে, সুতরাং মধ্যপন্থী সংকল্পের সাথে যে কেউ এটি সহজেই ভেঙে ফেলতে পারে।


6
আমি স্মেহমুডের স্ক্রিপ্ট ঠিক করেছিলাম এবং ডিকোডিংয়ের ফাংশনটি gist.github.com/ilogik/6f9431e4588015ecb194
অ্যাড্রিয়ান

3
মনোযোগ! স্মেহমুডের কোড এবং অ্যাড্রিয়ান মেসটারের ফিক্স উভয়ই কেবল নিম্ন আসকি রেঞ্জের অক্ষরের সাথে স্ট্রিংয়ের জন্য কাজ করে! % অপারেটর, ইউনিকোড ইনপুট ইত্যাদির প্রাধান্য দেখুন ওয়ার্কিং কোডের জন্য কানিলের উত্তর দেখুন
le_m

2
@ সিমহমুদ আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি'str' object cannot be interpreted as an integer
রোহিত খাত্রি

3
"আমি এক্সরেঞ্জ (স্ট্রিং) এর জন্য" আই ইন ইনরেঞ্জ (লেন (স্ট্রিং)) এর জন্য "চ্যাং করতে হতে পারে"
ইউজার 3113626

2
অজগর 2 এবং 3 এর জন্য এনকোডার এবং ডিকোডার: gist.github.com/gowhari/fea9c559f08a310e5cfd62978bc86a1a
iman

71

আপনি যেমন স্পষ্টভাবে বলেছেন যে আপনি অস্পষ্টতা সুরক্ষা না চান, আমরা আপনাকে প্রস্তাবিত দুর্বলতার জন্য আপনাকে তিরস্কার করা এড়াব :)

সুতরাং, পাইক্রিপ্টো ব্যবহার করে:

import base64
from Crypto.Cipher import AES

msg_text = b'test some plain text here'.rjust(32)
secret_key = b'1234567890123456'

cipher = AES.new(secret_key,AES.MODE_ECB) # never use ECB in strong systems obviously
encoded = base64.b64encode(cipher.encrypt(msg_text))
print(encoded)
decoded = cipher.decrypt(base64.b64decode(encoded))
print(decoded)

যদি কেউ আপনার ডাটাবেস এবং আপনার কোড বেস ধরে রাখে তবে তারা এনক্রিপ্ট হওয়া ডেটা ডিকোড করতে সক্ষম হবে। আপনার secret_keyসুরক্ষিত রাখুন !


3
আমি মনে করি না যতক্ষণ না __ টেক্সট দৈর্ঘ্যে 16 বাইটের একাধিক হয়, যেহেতু AES এনক্রিপশনের জন্য ব্লকগুলির প্রয়োজন হয় যা দৈর্ঘ্যে 16 এর গুণক হয়। স্বেচ্ছাসেবী দৈর্ঘ্যের চিত্র_টেক্সটের জন্য একটি কার্যকরী বাস্তবায়নের জন্য দৈর্ঘ্যের 16 টির একাধিকতে স্ট্রিংয়ের প্যাডিং যুক্ত করতে হবে।
টহস্টার

6
প্যাডিং সহ একটি উদাহরণ: pas.ubuntu.com/11024555 এটি নির্বিচারে পাসওয়ার্ড এবং বার্তার দৈর্ঘ্যের সাথে কাজ করে।
ইমান

3
@ না, এই বিশেষ encryptফাংশনটি রাষ্ট্রীয় dlitz.net/software/pycrypto/api/current/… তাই আপনার চেষ্টা করা উচিত নয় এবং এটি পুনরায় ব্যবহার করা উচিত।
উইল

1
@ উইল +1 তথ্য এবং লিঙ্কটির জন্য ধন্যবাদ। ভবিষ্যতে খুব ব্যয়বহুল বাগ ফিক্স থেকে আমাকে বাঁচিয়েছে।
ইথান

3
পুনরায় "শক্তিশালী সিস্টেমে অবশ্যই ইসিবি কখনই ব্যবহার করবেন না": আমি নিজের মজাদার জন্য এটি নিয়ে পরীক্ষা নিরীক্ষা করছি। তবে আমি আপনার কোডে উপরের মন্তব্যটি দেখেছি। আমাদের মধ্যে খুব ন্যূনতম সুরক্ষা / এনক্রিপশন / তথ্য-তত্ত্বের পটভূমি রয়েছে, "কখনই ব্যবহার করবেন না"? হতে পারে আরও একটি প্রশ্ন দরকার ... অথবা এটির একটি লিঙ্ক আছে।
ট্রেভর বয়েড স্মিথ

67

পাইথনের কোনও বিল্ট-ইন এনক্রিপশন স্কিম নেই, নেই। আপনার এনক্রিপ্ট করা ডেটা স্টোরেজটিকে গুরুতরভাবে নেওয়া উচিত; একটি বিকাশকারী অনিরাপদ হতে বুঝতে টিউভিয়াল এনক্রিপশন স্কিমগুলি এবং একটি খেলনা স্কিম কম অভিজ্ঞ বিকাশকারী দ্বারা একটি সুরক্ষিত স্কিমের জন্য ভালই ভুল হতে পারে। আপনি যদি এনক্রিপ্ট করেন তবে সঠিকভাবে এনক্রিপ্ট করুন।

সঠিক এনক্রিপশন স্কিমটি প্রয়োগ করতে আপনার খুব বেশি কাজ করার দরকার নেই। প্রথমত, ক্রিপ্টোগ্রাফি হুইলটি পুনরায় উদ্ভাবন করবেন না , এটি আপনার জন্য পরিচালনা করতে একটি বিশ্বস্ত ক্রিপ্টোগ্রাফি লাইব্রেরি ব্যবহার করুন। পাইথন 3 এর জন্য, এটি নির্ভরযোগ্য লাইব্রেরিcryptography

আমি এও প্রস্তাব দিচ্ছি যে এনক্রিপশন এবং ডিক্রিপশন বাইটগুলিতে প্রযোজ্য ; প্রথমে বাইটগুলিতে পাঠ্য বার্তাগুলি এনকোড করুন; stringvalue.encode()ইউটিএফ 8 এ এনকোডগুলি ব্যবহার করে সহজেই আবার ফিরানো হয়েছে bytesvalue.decode()

সর্বশেষে তবে অন্তত নয়, এনক্রিপ্ট করা এবং ডিক্রিপ্ট করার সময়, আমরা পাসওয়ার্ড নয়, কীগুলির বিষয়ে কথা বলি । একটি কী মানুষের স্মরণীয় হওয়া উচিত নয়, এটি এমন একটি জিনিস যা আপনি কোনও গোপন স্থানে সংরক্ষণ করেন তবে মেশিনটি পাঠযোগ্য, আপনি পারেন একটু যত্ন নিয়ে পাসওয়ার্ড থেকে একটি কী অর্জন ।

তবে কোনও ওয়েব অ্যাপ্লিকেশন বা কোনও ক্লাস্টারে চলছে এমন প্রক্রিয়া যাতে মানুষের মনোযোগ ছাড়াই এটি চালিয়ে যায়, আপনি একটি কী ব্যবহার করতে চান। পাসওয়ার্ডগুলি তখনই যখন কোনও শেষ-ব্যবহারকারীর নির্দিষ্ট তথ্যে অ্যাক্সেসের প্রয়োজন হয়। তারপরেও আপনি সাধারণত পাসওয়ার্ড দিয়ে অ্যাপ্লিকেশনটি সুরক্ষিত করেন, তারপরে কোনও কী ব্যবহার করে এনক্রিপ্ট করা তথ্যের বিনিময় করুন, সম্ভবত এটি ব্যবহারকারীর অ্যাকাউন্টে সংযুক্ত একটি one

প্রতিসম কী কী এনক্রিপশন

ফার্নেট - এইএস সিবিসি + এইচএমএসি, দৃ strongly়ভাবে প্রস্তাবিত

cryptographyগ্রন্থাগার রয়েছে Fernet রেসিপি , ক্রিপ্টোগ্রাফি ব্যবহার করার জন্য বেস্ট চর্চা রেসিপি। ফার্নেট একটি ওপেন স্ট্যান্ডার্ড , বিস্তৃত প্রোগ্রামিং ভাষাগুলিতে প্রস্তুত বাস্তবায়ন রয়েছে এবং এটি আপনার জন্য সংস্করণ তথ্য, একটি টাইমস্ট্যাম্প এবং একটি এইচএমএসি স্বাক্ষর সহ বার্তাপ্রাপ্তি রোধে AES সিবিসি এনক্রিপশন প্যাকেজ করে।

ফার্নেট বার্তা এবং এনক্রিপ্ট এবং ডিক্রিপ্ট করা খুব সহজ করে তোলে আপনাকে সুরক্ষিত রাখা । এটি একটি গোপনের সাথে ডেটা এনক্রিপ্ট করার জন্য আদর্শ পদ্ধতি।

আমি আপনাকে Fernet.generate_key()একটি নিরাপদ কী উত্পন্ন করতে ব্যবহার করার পরামর্শ দিচ্ছি । আপনি একটি পাসওয়ার্ডও (পরবর্তী বিভাগ) ব্যবহার করতে পারেন, তবে একটি সম্পূর্ণ 32-বাইট গোপন কী (স্বাক্ষর করার জন্য 16 বাইটস, আরও একটি স্বাক্ষর জন্য 16 টি) আপনার মনে হতে পারে এমন বেশিরভাগ পাসওয়ার্ডের চেয়ে আরও সুরক্ষিত হতে চলেছে।

ফার্নেট যে কী উত্পন্ন করে তা হ'ল bytesইউআরএল এবং ফাইল নিরাপদ বেস 64 অক্ষর যুক্ত একটি বস্তু, তাই মুদ্রণযোগ্য:

from cryptography.fernet import Fernet

key = Fernet.generate_key()  # store in a secure location
print("Key:", key.decode())

বার্তাগুলি এনক্রিপ্ট বা ডিক্রিপ্ট করতে, Fernet()প্রদত্ত কীটি দিয়ে একটি উদাহরণ তৈরি করুন এবং কল করুন Fernet.encrypt()বা Fernet.decrypt(), উভয়কে এনক্রিপ্ট করার জন্য সরলখর বার্তা এবং এনক্রিপ্ট করা টোকেন bytesঅবজেক্ট are

encrypt()এবং decrypt()ফাংশনগুলি দেখতে হবে:

from cryptography.fernet import Fernet

def encrypt(message: bytes, key: bytes) -> bytes:
    return Fernet(key).encrypt(message)

def decrypt(token: bytes, key: bytes) -> bytes:
    return Fernet(key).decrypt(token)

ডেমো:

>>> key = Fernet.generate_key()
>>> print(key.decode())
GZWKEhHGNopxRdOHS4H4IyKhLQ8lwnyU7vRLrM3sebY=
>>> message = 'John Doe'
>>> encrypt(message.encode(), key)
'gAAAAABciT3pFbbSihD_HZBZ8kqfAj94UhknamBuirZWKivWOukgKQ03qE2mcuvpuwCSuZ-X_Xkud0uWQLZ5e-aOwLC0Ccnepg=='
>>> token = _
>>> decrypt(token, key).decode()
'John Doe'

পাসওয়ার্ড সহ ফার্নেট - পাসওয়ার্ড থেকে প্রাপ্ত কী, সুরক্ষা কিছুটা দুর্বল করে

আপনি যদি কোনও শক্তিশালী কী ডেরাইভেশন পদ্ধতি ব্যবহার করেন তবে গোপন কী পরিবর্তে আপনি একটি পাসওয়ার্ড ব্যবহার করতে পারেন । তারপরে আপনাকে বার্তায় লবণ এবং এইচএমএসি পুনরাবৃত্তি গণনাটি অন্তর্ভুক্ত করতে হবে, সুতরাং এনক্রিপ্ট করা মান প্রথমে লবণ, গণনা এবং ফার্নেট টোকেনকে আলাদা না করে ফার্নেটের সাথে সামঞ্জস্যপূর্ণ নয়:

import secrets
from base64 import urlsafe_b64encode as b64e, urlsafe_b64decode as b64d

from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

backend = default_backend()
iterations = 100_000

def _derive_key(password: bytes, salt: bytes, iterations: int = iterations) -> bytes:
    """Derive a secret key from a given password and salt"""
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(), length=32, salt=salt,
        iterations=iterations, backend=backend)
    return b64e(kdf.derive(password))

def password_encrypt(message: bytes, password: str, iterations: int = iterations) -> bytes:
    salt = secrets.token_bytes(16)
    key = _derive_key(password.encode(), salt, iterations)
    return b64e(
        b'%b%b%b' % (
            salt,
            iterations.to_bytes(4, 'big'),
            b64d(Fernet(key).encrypt(message)),
        )
    )

def password_decrypt(token: bytes, password: str) -> bytes:
    decoded = b64d(token)
    salt, iter, token = decoded[:16], decoded[16:20], b64e(decoded[20:])
    iterations = int.from_bytes(iter, 'big')
    key = _derive_key(password.encode(), salt, iterations)
    return Fernet(key).decrypt(token)

ডেমো:

>>> message = 'John Doe'
>>> password = 'mypass'
>>> password_encrypt(message.encode(), password)
b'9Ljs-w8IRM3XT1NDBbSBuQABhqCAAAAAAFyJdhiCPXms2vQHO7o81xZJn5r8_PAtro8Qpw48kdKrq4vt-551BCUbcErb_GyYRz8SVsu8hxTXvvKOn9QdewRGDfwx'
>>> token = _
>>> password_decrypt(token, password).decode()
'John Doe'

আউটপুটে নুনকে অন্তর্ভুক্ত করা এলোমেলো লবণের মান ব্যবহার করা সম্ভব করে, যার ফলে পাসওয়ার্ড পুনরায় ব্যবহার বা বার্তা পুনরাবৃত্তি নির্বিশেষে এনক্রিপ্ট করা আউটপুট সম্পূর্ণরূপে এলোমেলোভাবে নিশ্চিত হওয়া নিশ্চিত করে। পুনরাবৃত্তি গণনা অন্তর্ভুক্ত করা নিশ্চিত করে যে আপনি পুরানো বার্তাগুলি ডিক্রিপ্ট করার ক্ষমতা না হারিয়ে সময়ের সাথে সাথে সিপিইউ কর্মক্ষমতা বৃদ্ধির জন্য সামঞ্জস্য করতে পারেন।

একা একটি পাসওয়ার্ড পারেন প্রদান আপনি যদি অনুরূপ আকার পুকুর থেকে একটি সঠিকভাবে র্যান্ডম পাসওয়ার্ড জেনারেট, একটি Fernet 32-বাইট র্যান্ডম কী-এর মত নিরাপদ হতে। 32 বাইটস আপনাকে 256 keys 32 সংখ্যক কী দেয়, সুতরাং আপনি যদি 74 টি বর্ণের বর্ণমালা ব্যবহার করেন (26 টি উচ্চতর, 26 নিম্ন, 10 সংখ্যা এবং 12 সম্ভাব্য চিহ্ন), তবে আপনার পাসওয়ার্ডটি কমপক্ষে math.ceil(math.log(256 ** 32, 74))== 42 অক্ষরের দীর্ঘ হওয়া উচিত । তবে, এইচএমএসি পুনরাবৃত্তির একটি ভালভাবে নির্বাচিত সংখ্যক এনট্রপির অভাব কিছুটা কমিয়ে আনতে পারে কারণ এটি আক্রমণকারীর পক্ষে তাদের জোর করে প্রবেশ করা আরও বেশি ব্যয়বহুল করে তোলে।

কেবলমাত্র জেনে থাকুন যে একটি সংক্ষিপ্ততর তবে এখনও যুক্তিসঙ্গতভাবে সুরক্ষিত পাসওয়ার্ড এই স্কিমটিকে পঙ্গু করে দেবে না, এটি কেবল একটি কার্যকর শক্তি আক্রমণকারীকে অনুসন্ধান করতে হবে এমন সম্ভাব্য মানের সংখ্যা হ্রাস করে; আপনার সুরক্ষা প্রয়োজনীয়তার জন্য যথেষ্ট শক্তিশালী পাসওয়ার্ড বেছে নেওয়ার বিষয়টি নিশ্চিত করুন ।

বিকল্প

অস্পষ্ট

একটি বিকল্প এনক্রিপ্ট করা হয় না । ভিগনেরে বলুন, কেবলমাত্র একটি স্বল্প-সুরক্ষার সাইফার বা একটি হোম-স্প্যান বাস্তবায়নের প্রলোভন করবেন না। এই পদ্ধতির কোনও সুরক্ষা নেই, তবে ভবিষ্যতে আপনার কোডটি সুরক্ষার মায়া বজায় রাখার জন্য দেওয়া একটি অনভিজ্ঞ বিকাশকারীকে দিতে পারেন, যা মোটেই সুরক্ষার চেয়ে খারাপ নয়।

আপনার যা যা দরকার তা হ'ল অস্পষ্টতা, কেবলমাত্র ডেটা বেস 64; ইউআরএল-নিরাপদ প্রয়োজনীয়তার জন্য, base64.urlsafe_b64encode()ফাংশনটি ভাল। এখানে কোনও পাসওয়ার্ড ব্যবহার করবেন না, কেবল এনকোড করুন এবং আপনার কাজ শেষ। সর্বাধিক, কিছু সংক্ষেপণ যুক্ত করুন (যেমন zlib):

import zlib
from base64 import urlsafe_b64encode as b64e, urlsafe_b64decode as b64d

def obscure(data: bytes) -> bytes:
    return b64e(zlib.compress(data, 9))

def unobscure(obscured: bytes) -> bytes:
    return zlib.decompress(b64d(obscured))

এটি পরিণত b'Hello world!'হয় b'eNrzSM3JyVcozy_KSVEEAB0JBF4='

কেবলমাত্র আন্তরিকতা

অবিশ্বস্ত ক্লায়েন্টের কাছে পাঠানো এবং ফিরে পাওয়ার পরে ডেটা আনলটারে ভরসা করা যেতে পারে তা নিশ্চিত করার একটি উপায় যদি আপনার প্রয়োজন হয় তবে আপনি ডেটাতে স্বাক্ষর করতে চান, আপনি SHA1 এর সাথে hmacলাইব্রেরিটি ব্যবহার করতে পারেন (এখনও এইচএমএসি সাইন ইন করার জন্য নিরাপদ হিসাবে বিবেচিত ) বা আরও ভাল:

import hmac
import hashlib

def sign(data: bytes, key: bytes, algorithm=hashlib.sha256) -> bytes:
    assert len(key) >= algorithm().digest_size, (
        "Key must be at least as long as the digest size of the "
        "hashing algorithm"
    )
    return hmac.new(key, data, algorithm).digest()

def verify(signature: bytes, data: bytes, key: bytes, algorithm=hashlib.sha256) -> bytes:
    expected = sign(data, key, algorithm)
    return hmac.compare_digest(expected, signature)

ডেটাতে স্বাক্ষর করতে এটি ব্যবহার করুন, তারপরে ডেটা সহ স্বাক্ষরটি সংযুক্ত করুন এবং ক্লায়েন্টকে প্রেরণ করুন। আপনি যখন ডেটা ফিরে পান, ডেটা এবং স্বাক্ষর বিভক্ত করুন এবং যাচাই করুন। আমি SHA256 এ ডিফল্ট অ্যালগরিদম সেট করেছি, সুতরাং আপনার একটি 32-বাইট কী প্রয়োজন:

key = secrets.token_bytes(32)

আপনি itsdangerousগ্রন্থাগারটি দেখতে চাইতে পারেন , যা বিভিন্ন ফর্ম্যাটে সিরিয়ালাইজেশন এবং ডি-সিরিয়ালাইজেশনের সাথে এটি প্যাকেজ করে।

এনক্রিপশন এবং সততা সরবরাহ করতে AES-GCM এনক্রিপশন ব্যবহার করা Using

ফার্নেট এনক্রিপ্ট হওয়া ডেটার অখণ্ডতা নিশ্চিত করতে এইচএমএসি স্বাক্ষর সহ এইসি-সিবিসি তৈরি করে; দূষিত আক্রমণকারী আপনার সার্ভিসটিকে খারাপ ইনপুট সহ চেনাশোনাগুলিতে ব্যস্ত রাখতে আপনার সিস্টেমে বাজে ডেটা খাওয়াতে পারে না, কারণ সিফেরেক্সটেক্স সই হয়েছে।

গ্যালোয়া / কাউন্টার মোড ব্লক সাইফার ciphertext এবং উৎপন্ন ট্যাগ একই উদ্দেশ্য পরিবেশন, তাই একই উদ্দেশ্যে পরিবেশন করা ব্যবহার করা যাবে। অবক্ষয়টি হ'ল ফার্নেটের বিপরীতে অন্য প্ল্যাটফর্মগুলিতে পুনরায় ব্যবহারের জন্য সহজে ব্যবহারের এক-আকারের ফিট-সমস্ত রেসিপি নেই। এইএস-জিসিএমও প্যাডিং ব্যবহার করে না, সুতরাং এই এনক্রিপশন সিফারেক্সটেক্সটি ইনপুট বার্তার দৈর্ঘ্যের সাথে মেলে (যেখানে ফার্নেট / এইএস-সিবিসি বার্তাগুলিকে নির্দিষ্ট দৈর্ঘ্যের ব্লকের সাথে এনক্রিপ্ট করে, বার্তার দৈর্ঘ্যটিকে কিছুটা অস্পষ্ট করে)।

AES256-GCM সাধারণত 32 বাইট সিক্রেটটি কী হিসাবে গ্রহণ করে:

key = secrets.token_bytes(32)

তারপরে ব্যবহার করুন

import binascii, time
from base64 import urlsafe_b64encode as b64e, urlsafe_b64decode as b64d

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.exceptions import InvalidTag

backend = default_backend()

def aes_gcm_encrypt(message: bytes, key: bytes) -> bytes:
    current_time = int(time.time()).to_bytes(8, 'big')
    algorithm = algorithms.AES(key)
    iv = secrets.token_bytes(algorithm.block_size // 8)
    cipher = Cipher(algorithm, modes.GCM(iv), backend=backend)
    encryptor = cipher.encryptor()
    encryptor.authenticate_additional_data(current_time)
    ciphertext = encryptor.update(message) + encryptor.finalize()        
    return b64e(current_time + iv + ciphertext + encryptor.tag)

def aes_gcm_decrypt(token: bytes, key: bytes, ttl=None) -> bytes:
    algorithm = algorithms.AES(key)
    try:
        data = b64d(token)
    except (TypeError, binascii.Error):
        raise InvalidToken
    timestamp, iv, tag = data[:8], data[8:algorithm.block_size // 8 + 8], data[-16:]
    if ttl is not None:
        current_time = int(time.time())
        time_encrypted, = int.from_bytes(data[:8], 'big')
        if time_encrypted + ttl < current_time or current_time + 60 < time_encrypted:
            # too old or created well before our current time + 1 h to account for clock skew
            raise InvalidToken
    cipher = Cipher(algorithm, modes.GCM(iv, tag), backend=backend)
    decryptor = cipher.decryptor()
    decryptor.authenticate_additional_data(timestamp)
    ciphertext = data[8 + len(iv):-16]
    return decryptor.update(ciphertext) + decryptor.finalize()

ফার্নেট সমর্থন করে এমন একই সময়ে-লাইভ-ব্যবহারের ক্ষেত্রে সমর্থন করার জন্য আমি একটি টাইমস্ট্যাম্প অন্তর্ভুক্ত করেছি।

পাইথন 3 এ এই পৃষ্ঠাতে অন্যান্য পন্থা

এইএস সিএফবি - সিবিসির মতো তবে প্যাডের প্রয়োজন ছাড়াই

এই পদ্ধতির যে সকল Іѕ Vаиітy অনুসরণ করে, ভুল যদ্যপি। এটি cryptographyসংস্করণ, তবে নোট করুন যে আমি আইফিকে সিফারেক্সটেক্সে অন্তর্ভুক্ত করেছি , এটি বিশ্বব্যাপী হিসাবে সংরক্ষণ করা উচিত নয় (আইভি পুনরায় ব্যবহার করা কীটির সুরক্ষাকে দুর্বল করে এবং মডিউলটিকে বিশ্বব্যাপী সংরক্ষণ করে এটি পুনরায় উত্পন্ন হবে পরবর্তী পাইথন অনুরোধ, সমস্ত সাইফারেক্সট অনির্ক্রিয়াযোগ্য রেন্ডারিং):

import secrets
from base64 import urlsafe_b64encode as b64e, urlsafe_b64decode as b64d

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

backend = default_backend()

def aes_cfb_encrypt(message, key):
    algorithm = algorithms.AES(key)
    iv = secrets.token_bytes(algorithm.block_size // 8)
    cipher = Cipher(algorithm, modes.CFB(iv), backend=backend)
    encryptor = cipher.encryptor()
    ciphertext = encryptor.update(message) + encryptor.finalize()
    return b64e(iv + ciphertext)

def aes_cfb_decrypt(ciphertext, key):
    iv_ciphertext = b64d(ciphertext)
    algorithm = algorithms.AES(key)
    size = algorithm.block_size // 8
    iv, encrypted = iv_ciphertext[:size], iv_ciphertext[size:]
    cipher = Cipher(algorithm, modes.CFB(iv), backend=backend)
    decryptor = cipher.decryptor()
    return decryptor.update(encrypted) + decryptor.finalize()

এটিতে এইচএমএসি স্বাক্ষর যুক্ত আর্মারিংয়ের অভাব রয়েছে এবং কোনও টাইমস্ট্যাম্প নেই; আপনাকে সেগুলি নিজেরাই যুক্ত করতে হবে।

উপরেরটিও ব্যাখ্যা করে যে বেসিক ক্রিপ্টোগ্রাফি বিল্ডিং ব্লকগুলি ভুলভাবে একত্রিত করা কতটা সহজ; আইভি ভ্যালুতে সমস্ত ভাইয়ের ভুল পরিচালনা থেকে ডেটা লঙ্ঘন বা সমস্ত এনক্রিপ্ট হওয়া বার্তাগুলি অপঠনযোগ্য হতে পারে কারণ আইভি হারিয়ে গেছে lost পরিবর্তে ফার্নেট ব্যবহার আপনাকে এ জাতীয় ভুল থেকে রক্ষা করে।

AES ইসিবি - নিরাপদ নয়

আপনি যদি আগে এইএস ইসিবি এনক্রিপশন প্রয়োগ করেছেন এবং পাইথন 3 এ এখনও এটি সমর্থন করার প্রয়োজন হয় তবে আপনি এখনও এটি দিয়ে cryptographyকরতে পারেন। একই ক্যাভ্যাটস প্রয়োগ হয়, ইসিবি বাস্তব জীবনের অ্যাপ্লিকেশনগুলির জন্য যথেষ্ট নিরাপদ নয় । পাইথন 3 এর উত্তরটি পুনরায় বাস্তবায়ন করুন, প্যাডিংয়ের স্বয়ংক্রিয় হ্যান্ডলিং যুক্ত করুন:

from base64 import urlsafe_b64encode as b64e, urlsafe_b64decode as b64d

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend

backend = default_backend()

def aes_ecb_encrypt(message, key):
    cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)
    encryptor = cipher.encryptor()
    padder = padding.PKCS7(cipher.algorithm.block_size).padder()
    padded = padder.update(msg_text.encode()) + padder.finalize()
    return b64e(encryptor.update(padded) + encryptor.finalize())

def aes_ecb_decrypt(ciphertext, key):
    cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)
    decryptor = cipher.decryptor()
    unpadder = padding.PKCS7(cipher.algorithm.block_size).unpadder()
    padded = decryptor.update(b64d(ciphertext)) + decryptor.finalize()
    return unpadder.update(padded) + unpadder.finalize()

আবার এটির মধ্যে এইচএমএসি স্বাক্ষর নেই এবং আপনার কোনওভাবে ইসিবি ব্যবহার করা উচিত নয়। উপরেরটি কেবল চিত্রিত করার জন্য রয়েছে cryptographyযা সাধারণ ক্রিপ্টোগ্রাফিক বিল্ডিং ব্লকগুলি পরিচালনা করতে পারে, এমনকি আপনার প্রকৃত ব্যবহার করা উচিত নয়।


51

@ স্মেহমুডের ভিগনারে সিফার উত্তরে উল্লিখিত "এনকোডড_সি" হওয়া উচিত "কী_সি"।

এখানে এনকোড / ডিকোড ফাংশন কাজ করছে।

import base64
def encode(key, clear):
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc))

def decode(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc)
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)

দাবি অস্বীকার: মন্তব্য দ্বারা ইঙ্গিত হিসাবে , আপনি যদি এটি পড়েন না এবং আইনজীবীদের সাথে কথা বলতে আপত্তি না করেন তবে এটি সত্যিকারের অ্যাপ্লিকেশনটিতে ডেটা সুরক্ষার জন্য ব্যবহার করা উচিত নয় :

এক্সওর এনক্রিপশনে কী সমস্যা?


2
অনেক দরকারী, ধন্যবাদ। আমি নীচে একটি পাইথন 3 সংস্করণ পোস্ট করেছি (এটি মন্তব্যগুলিতে কুৎসিত দেখাচ্ছে)
রায়ান ব্যারেট

1
"শ্নিয়ার্স আইন" : যে কোনও ব্যক্তি, সবচেয়ে ক্লাসহীন অপেশাদার থেকে সেরা ক্রিপ্টোগ্রাফার পর্যন্ত, একটি অ্যালগরিদম তৈরি করতে পারেন যা তিনি নিজেই ভেঙে দিতে পারবেন না। এটি ব্যবহার করবেন না, এটি সুরক্ষার কাছাকাছিও নয়।
zaph

3
গ্রেট! এই সংস্করণটি অ্যাকসেন্টগুলির সাথে স্ট্রিংয়ের জন্যও কাজ করে, যেখানে @ স্মম্মুডের সংস্করণটি তা করে না। ব্যবহারের উদাহরণ:, encodedmsg = encode('mypassword', 'this is the message éçàèç"') print encodedmsg print decode('mypassword', encodedmsg)এটি দুর্দান্ত কাজ করে।
বাসজ

2
এই কোডের উপর ভিত্তি করে এখানে একটি সাব্লাইম পাঠ্য প্লাগইন রয়েছে , সিটিআরএল + শিফট + পি এর পরে "আইনকোড" বা "ডিডিডকোড" এর সাহায্যে পাঠ্যের সহজে এনকোডিং / ডিকোডিংয়ের অনুমতি দেয়।
বাসজ

2
@basj উদাহরণের জন্য আপনাকে ধন্যবাদ
sk03

49

@ ক্নিলের উত্তর থেকে ফাংশনের একটি পাইথন 3 সংস্করণ এখানে রয়েছে :

import base64
def encode(key, clear):
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc).encode()).decode()

def decode(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc).decode()
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)

অতিরিক্ত এনকোড / ডিকোডগুলি দরকার কারণ পাইথন 3 স্ট্রিং / বাইট অ্যারেগুলিকে দুটি পৃথক ধারণায় বিভক্ত করেছে এবং প্রতিফলিত করতে তাদের এপিআইগুলি আপডেট করেছে ..


4
ধন্যবাদ রায়ান, আপনি @Qniell টাইপ করেছেন
qneill

3
যারা ভাবছেন তাদের মধ্যে পার্থক্যগুলি হ'ল .encode()).decode()। এর বিনিময়ে encode(), এবং .decode()দ্বিতীয় লাইনে decode()
রল্ফব্লি

2
হুম, এনকোডেড কোডটি সত্যই অনন্য নয়, আমি একটি পরীক্ষা চালিয়েছি এবং এটি 11,22,33,44, ..., 88,99,111,222, ... এর সব কোড কী দেখায়, সর্বদা আগের মত একই কোড থাকে। তবে আমি এটির প্রশংসা করি
হজকিগিসি

1
@ রায়ান ব্যারেট, ডিকোডিংয়ের পরে কি পাসওয়ার্ডের সঠিকতা পরীক্ষা করা সম্ভব? আসুন আমি বলি যে আমি একটি এনকোডযুক্ত স্ট্রিং প্রেরণ করেছি যিনি কী জানেন, তিনি যদি টাইপ দিয়ে কীটি প্রবেশ করেন তবে কী হবে? ডিকোড এখনও তাকে একটি "ডিকোডেড" স্ট্রিং দেয় তবে এটি সঠিক নয়, তিনি কীভাবে বলতে পারেন?
হেইঞ্জ

26

দাবি অস্বীকার: মন্তব্যগুলিতে উল্লিখিত হিসাবে, এটি বাস্তব প্রয়োগে ডেটা রক্ষা করতে ব্যবহার করা উচিত নয়

এক্সওর এনক্রিপশনে কী সমস্যা?

/crypto/56281/breaking-a-xor-cipher-of-known-key-length

https://github.com/hellman/xortool


যেমনটি বলা হয়েছে পাইক্রিপ্টো লাইব্রেরিতে সাইফারের একটি স্যুট রয়েছে contains আপনি নিজেই না করতে চাইলে এই XOR "সিফার" নোংরা কাজটি করতে ব্যবহৃত হতে পারে:

from Crypto.Cipher import XOR
import base64

def encrypt(key, plaintext):
  cipher = XOR.new(key)
  return base64.b64encode(cipher.encrypt(plaintext))

def decrypt(key, ciphertext):
  cipher = XOR.new(key)
  return cipher.decrypt(base64.b64decode(ciphertext))

সাইফারটি প্লেইন টেক্সট প্যাড না করে নীচে হিসাবে কাজ করে:

>>> encrypt('notsosecretkey', 'Attack at dawn!')
'LxsAEgwYRQIGRRAKEhdP'

>>> decrypt('notsosecretkey', encrypt('notsosecretkey', 'Attack at dawn!'))
'Attack at dawn!'

বেস 64৪ টি এনকোড / ডিকোড ফাংশনগুলির জন্য https://stackoverflow.com/a/2490376/241294 এ ক্রেডিট (আমি একটি অজগর নবাগত)।


দ্রষ্টব্য: ক্রিপ্টো মডিউল পাইথন 3 এ ইনস্টলড পাইক্রিপ্টপ দ্বারা ইনস্টল করা আছে, ক্রিপ্টো নয়। sudo pip3 install pycrypto
নিখিল ভিজে

2
দ্রষ্টব্য: পাইকারিপ্টো আমার শেষে হিরকাপ্যাপে ইনস্টল করতে ব্যর্থ হয়েছিল। আমি এই পোস্টিংটি পেয়েছি .. বলে মনে হচ্ছে পাইক্রিপ্টো প্যাকেজটিকে পাইক্রিপ্টোডোম ইনসিটাল নামে আরেকটি দিয়ে প্রতিস্থাপন করা হয়েছে, এবং সেই এক্সওআর পদ্ধতিটি অবচয় করা হয়েছে: github.com
নিখিল ভিজে

2
এই পদ্ধতিটি কখনও ব্যবহার করবেন না , ডকুমেন্টেশনে এই 'সিফার' এর বর্ণনাটি নোট করুন: এক্সওর খেলনা সাইফার, এক্সওআর হ'ল একটি সহজ স্ট্রিম সাইফার। এনক্রিপশন এবং ডিক্রিপশনটি কীআরটিজেট করে তৈরি কী-স্ট্রিমের সাহায্যে এক্সওর-ইনগ ডেটা দ্বারা সম্পাদিত হয়। বাস্তব অ্যাপ্লিকেশন জন্য এটি ব্যবহার করবেন না!
মার্টিজন পিটারস

@ মার্তিজজনপিটার আপনি ঠিক বলেছেন আশা করি আমার সম্পাদনাটি সেই বিষয়টি পরিষ্কার করেছে।
পোইডা

12

AES (পাইক্রিপ্টো) এবং বেস 64 ব্যবহার করে URL টি নিরাপদ এনক্রিপশন এবং ডিক্রিপশন এর একটি বাস্তবায়ন এখানে রয়েছে।

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

AKEY = b'mysixteenbytekey' # AES key must be either 16, 24, or 32 bytes long

iv = Random.new().read(AES.block_size)

def encode(message):
    obj = AES.new(AKEY, AES.MODE_CFB, iv)
    return base64.urlsafe_b64encode(obj.encrypt(message))

def decode(cipher):
    obj2 = AES.new(AKEY, AES.MODE_CFB, iv)
    return obj2.decrypt(base64.urlsafe_b64decode(cipher))

নীচের ডিকোডিংয়ের সময় আপনি যদি https://bugs.python.org/issue4329 ( TypeError: character mapping must return integer, None or unicode) ব্যবহারের মতো কোনও সমস্যার মুখোমুখি str(cipher)হন:

return obj2.decrypt(base64.urlsafe_b64decode(str(cipher)))

টেস্ট:

In [13]: encode(b"Hello World")
Out[13]: b'67jjg-8_RyaJ-28='

In [14]: %timeit encode("Hello World")
100000 loops, best of 3: 13.9 µs per loop

In [15]: decode(b'67jjg-8_RyaJ-28=')
Out[15]: b'Hello World'

In [16]: %timeit decode(b'67jjg-8_RyaJ-28=')
100000 loops, best of 3: 15.2 µs per loop

উইন্ডোজ x64 + + পাইথন 3.6 + + PyCryptodome (যেমন pycrypto অবচিত) সঙ্গে বাগ: TypeError: Object type <class 'str'> cannot be passed to C code
বাস্জ

@ বাসজ ওও আফসোস .. আমি উইন্ডোজ ব্যবহার করি না, তাই আমি ঠিক করতে পারি না।
সমস্ত Іѕ Vаиітy

আইভি উত্পন্ন করবেন না এবং এটি মডিউল স্তরে সংরক্ষণ করবেন না, আপনাকে ফিরে আসা সিফারেক্সট বার্তায় আইভি অন্তর্ভুক্ত করতে হবে ! আপনি এখন দুটি সমস্যা চালু করেছেন: পাইথন প্রক্রিয়া পুনরায় আরম্ভ করা আপনাকে নতুন আইভি দেয় যা পূর্বে এনক্রিপ্ট করা বার্তাগুলি ডিক্রিপ্ট করা অসম্ভব করে দেয় এবং এর মধ্যে আপনি একাধিক বার্তাগুলির জন্য আইভি পুনরায় ব্যবহার করছেন, যা কার্যকরভাবে ইসিবি স্তরে ফিরে সুরক্ষাটিকে হ্রাস করে।
মার্টিজন পিটারস

1
@ AllІѕVаиітy এর সাথে সমাধান হয়েছে b'...', আমি ভবিষ্যতের রেফারেন্সের জন্য উত্তরটি সম্পাদনা করেছি!
বাসজ

8

পাইথন 3-এ এনকোড / ডিকোড ফাংশনগুলি কাজ করা (কিনিলের উত্তর থেকে খুব সামান্য অভিযোজিত):

def encode(key, clear):
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = (ord(clear[i]) + ord(key_c)) % 256
        enc.append(enc_c)
    return base64.urlsafe_b64encode(bytes(enc))

def decode(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc)
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + enc[i] - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)

8

কিছু দুর্দান্ত উত্তরের জন্য ধন্যবাদ। যোগ করার জন্য আসল কিছুই নয়, তবে এখানে কিছু কার্যকর পাইথন সুবিধা ব্যবহার করে কুইনেলের উত্তরের কিছু প্রগতিশীল রাইটারাইটস দেওয়া হয়েছে। আমি আশা করি আপনি সম্মত হন তারা কোডটি সহজীকরণ এবং স্পষ্ট করেছেন।

import base64


def qneill_encode(key, clear):
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc))


def qneill_decode(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc)
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)

enumerate()- তালিকার আইটেমগুলিকে তাদের সূচকের সাথে জুড়ুন

একটি স্ট্রিং মধ্যে অক্ষর উপর পুনরাবৃত্তি

def encode_enumerate(key, clear):
    enc = []
    for i, ch in enumerate(clear):
        key_c = key[i % len(key)]
        enc_c = chr((ord(ch) + ord(key_c)) % 256)
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc))


def decode_enumerate(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc)
    for i, ch in enumerate(enc):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(ch) - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)

একটি তালিকা বোধগম্যতা ব্যবহার করে তালিকা তৈরি করুন

def encode_comprehension(key, clear):
    enc = [chr((ord(clear_char) + ord(key[i % len(key)])) % 256)
                for i, clear_char in enumerate(clear)]
    return base64.urlsafe_b64encode("".join(enc))


def decode_comprehension(key, enc):
    enc = base64.urlsafe_b64decode(enc)
    dec = [chr((256 + ord(ch) - ord(key[i % len(key)])) % 256)
           for i, ch in enumerate(enc)]
    return "".join(dec)

পাইথনে প্রায়শই তালিকা সূচকের কোনও প্রয়োজন হয় না। সম্পূর্ণরূপে জিপ এবং চক্র ব্যবহার করে লুপ সূচক ভেরিয়েবলগুলি নির্মূল করুন:

from itertools import cycle


def encode_zip_cycle(key, clear):
    enc = [chr((ord(clear_char) + ord(key_char)) % 256)
                for clear_char, key_char in zip(clear, cycle(key))]
    return base64.urlsafe_b64encode("".join(enc))


def decode_zip_cycle(key, enc):
    enc = base64.urlsafe_b64decode(enc)
    dec = [chr((256 + ord(enc_char) - ord(key_char)) % 256)
                for enc_char, key_char in zip(enc, cycle(key))]
    return "".join(dec)

এবং কিছু পরীক্ষা ...

msg = 'The quick brown fox jumps over the lazy dog.'
key = 'jMG6JV3QdtRh3EhCHWUi'
print('cleartext: {0}'.format(msg))
print('ciphertext: {0}'.format(encode_zip_cycle(key, msg)))

encoders = [qneill_encode, encode_enumerate, encode_comprehension, encode_zip_cycle]
decoders = [qneill_decode, decode_enumerate, decode_comprehension, decode_zip_cycle]

# round-trip check for each pair of implementations
matched_pairs = zip(encoders, decoders)
assert all([decode(key, encode(key, msg)) == msg for encode, decode in matched_pairs])
print('Round-trips for encoder-decoder pairs: all tests passed')

# round-trip applying each kind of decode to each kind of encode to prove equivalent
from itertools import product
all_combinations = product(encoders, decoders)
assert all(decode(key, encode(key, msg)) == msg for encode, decode in all_combinations)
print('Each encoder and decoder can be swapped with any other: all tests passed')

>>> python crypt.py
cleartext: The quick brown fox jumps over the lazy dog.
ciphertext: vrWsVrvLnLTPlLTaorzWY67GzYnUwrSmvXaix8nmctybqoivqdHOic68rmQ=
Round-trips for encoder-decoder pairs: all tests passed
Each encoder and decoder can be swapped with any other: all tests passed

খুব সুন্দর @ নিক, পাইথোনিজমের ভাল অগ্রগতি এবং খুব বুট পরীক্ষাও। সঠিক কৃতিত্ব দিতে আমি শুধু Smehmood মূল উত্তরে একটি বাগ ফিক্সিং হয়েছিল stackoverflow.com/a/2490718/468252
কিনিল

4

আপনি যদি নিরাপদে থাকতে চান তবে আপনি ফার্নেট ব্যবহার করতে পারেন, যা ক্রিপ্টোগ্রাফিকভাবে সাউন্ড। আপনি যদি এটি আলাদাভাবে সংরক্ষণ করতে না চান তবে আপনি একটি স্থিতিশীল "নুন" ব্যবহার করতে পারেন - আপনি কেবল অভিধান এবং রেইনবো আক্রমণ প্রতিরোধ হারাবেন। আমি এটি বেছে নিয়েছি কারণ আমি দীর্ঘ বা সংক্ষিপ্ত পাসওয়ার্ড বেছে নিতে পারি ´ যা এইএস এর সাথে এত সহজ নয়।

from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64

#set password
password = "mysecretpassword"
#set message
message = "secretmessage"

kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt="staticsalt", iterations=100000, backend=default_backend())
key = base64.urlsafe_b64encode(kdf.derive(password))
f = Fernet(key)

#encrypt
encrypted = f.encrypt(message)
print encrypted

#decrypt
decrypted = f.decrypt(encrypted)
print decrypted

যদি এটি খুব জটিল হয় তবে কেউ সরলসীকরণের পরামর্শ দিয়েছেন

from simplecrypt import encrypt, decrypt
ciphertext = encrypt('password', plaintext)
plaintext = decrypt('password', ciphertext)

কেবল একটি লবণ তৈরি করুন এবং এটিকে এনক্রিপশনের ফলাফলের মধ্যে অন্তর্ভুক্ত করুন যাতে পুনরাবৃত্ত পাসওয়ার্ড এবং বার্তা এখনও এলোমেলো আউটপুট দেয় in অ্যালগরিদমের ভবিষ্যতের প্রমাণের জন্য পুনরাবৃত্তির মানটি অন্তর্ভুক্ত করুন তবে এখনও কোনও পৃথক পুনরাবৃত্তি গণনা ব্যবহার করে বার্তাগুলি ডিক্রিপ্ট করতে সক্ষম হন।
মার্টিজন পিটারস

3

যে কেউ এখানে এসেছিল (এবং সৌভাগ্যবান) মনে হয়েছিল যে খুব বেশি সেটআপ নেই এমন এক-লাইনার সন্ধান করছে, যা অন্যান্য উত্তর সরবরাহ করে না। সুতরাং আমি বেস 64 এগিয়ে রাখছি।

এখন, মনে রাখবেন যে এটি কেবলমাত্র মৌলিক দ্বন্দ্ব, এবং ** সুরক্ষার পক্ষে ঠিক নেই ** , তবে এখানে কয়েকটি ওয়ান-লাইনার রয়েছে:

from base64 import urlsafe_b64encode, urlsafe_b64decode

def encode(data, key):
    return urlsafe_b64encode(bytes(key+data, 'utf-8'))

def decode(enc, key):
    return urlsafe_b64decode(enc)[len(key):].decode('utf-8')

print(encode('hi', 'there')) # b'dGhlcmVoaQ=='
print(decode(encode('hi', 'there'), 'there')) # 'hi'

কয়েকটি বিষয় লক্ষণীয়:

  • আপনি আপনার / O এর উপর নির্ভর করে নিজের থেকে আরও / কম বাইট-টু-স্ট্রিং এনকোডিং / ডিকোডিংয়ের সাথে ডিল করতে চান। দেখব bytes()এবংbytes::decode()
  • বেস 64 ব্যবহার করা অক্ষরের প্রকারের দ্বারা সহজেই চিহ্নিতযোগ্য এবং প্রায়শই =অক্ষর দিয়ে শেষ হয় । আমার মতো লোকেরা জাভাস্ক্রিপ্ট কনসোলে তাদের ডিকোডিং করতে প্রায় ঘুরে দেখি যখন আমরা তাদের ওয়েবসাইটে দেখি। এটি যতটা সহজ btoa(string)(জেএস)
  • ক্রমটি কী + ডেটা, যেমন বি 64 হিসাবে, শেষে কী অক্ষরগুলি প্রদর্শিত হয় তার উপর নির্ভর করে কোন অক্ষর শুরুতে থাকে (বাইট অফসেটের কারণে Wikipedia উইকিপিডিয়ায় কিছু সুন্দর ব্যাখ্যা রয়েছে)। এই দৃশ্যে, এনকোডযুক্ত স্ট্রিংয়ের শুরুটি কীটির সাথে এনকোড করা সমস্ত কিছুর জন্য একই হবে। প্লাসটি হ'ল ডেটা আরও অচল হয়ে যাবে। এটিকে অন্য উপায়ে করলে ফলাফল কী হিসাবে নির্বিশেষে সকলের কাছে ডেটা অংশটি হুবহু মিলে যায়।

এখন, আপনি যা চেয়েছিলেন তা যদি কোনও ধরণের চাবিও না প্রয়োজন তবে কিছুটা অবসন্নতা থাকে তবে আপনি আবার কোনও ধরণের কী ছাড়া কেবল বেস 64 ব্যবহার করতে পারেন:

from base64 import urlsafe_b64encode, urlsafe_b64decode

def encode(data):
    return urlsafe_b64encode(bytes(data, 'utf-8'))

def decode(enc):
    return urlsafe_b64decode(enc).decode()

print(encode('hi')) # b'aGk='
print(decode(encode('hi'))) # 'hi'

2
হ্যাঁ, আপনি যদি সুরক্ষা সম্পর্কে জড়িত না হন তবে বেস 64 এনক্রিপ্ট করার চেয়ে ভাল।
মার্টিজন পিটারস

অন্য উত্তরগুলি ওয়ান-লাইনার না হওয়ার বিষয়ে: এটি প্রশ্নের মূল বিষয় নয়। তারা কল করার জন্য দুটি ফাংশন চেয়েছে। এবং Fernet(key).encrypt(message)এটি কেবল আপনার বেস 64 কলের মত একটি এক্সপ্রেশন।
মার্টিজন পিটারস

আর তুমি উচিত অপসারণkey পুরাপুরি। প্রচুর বিকাশকারী মনোযোগ না দিয়ে স্ট্যাক ওভারফ্লো থেকে অনুলিপি এবং পেস্ট করতে চলেছে এবং কীটি গোপনীয় বলে ধরে নিবে । যদি আপনি এটি অবশ্যই অন্তর্ভুক্ত করেন তবে খুব কমপক্ষে এটি ব্যবহার করবেন না এবং সতর্কতা বা যেকোনভাবে ব্যবহার করা থাকলে ব্যতিক্রম বাড়াতে হবে না। কপি-পেস্ট সংস্কৃতির বোকামি এবং বুদ্ধিমান ফাংশন সরবরাহ করার জন্য আপনার দায়িত্বকে কম মূল্য দেবেন না।
মার্টিজন পিটারস

3

আমি 4 টি সমাধান দেব:

1) cryptographyগ্রন্থাগারের সাথে ফার্নেট এনক্রিপশন ব্যবহার করা

প্যাকেজটি ব্যবহার করে এমন একটি সমাধান এখানে দেওয়া হয়েছে cryptographyযা আপনি যথারীতি ইনস্টল করতে পারেন pip install cryptography:

import base64
from cryptography.fernet import Fernet, InvalidToken
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

def cipherFernet(password):
    key = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=b'abcd', iterations=1000, backend=default_backend()).derive(password)
    return Fernet(base64.urlsafe_b64encode(key))

def encrypt1(plaintext, password):
    return cipherFernet(password).encrypt(plaintext)

def decrypt1(ciphertext, password):
    return cipherFernet(password).decrypt(ciphertext)

# Example:

print(encrypt1(b'John Doe', b'mypass'))  
# b'gAAAAABd53tHaISVxFO3MyUexUFBmE50DUV5AnIvc3LIgk5Qem1b3g_Y_hlI43DxH6CiK4YjYHCMNZ0V0ExdF10JvoDw8ejGjg=='
print(decrypt1(b'gAAAAABd53tHaISVxFO3MyUexUFBmE50DUV5AnIvc3LIgk5Qem1b3g_Y_hlI43DxH6CiK4YjYHCMNZ0V0ExdF10JvoDw8ejGjg==', b'mypass')) 
# b'John Doe'
try:  # test with a wrong password
    print(decrypt1(b'gAAAAABd53tHaISVxFO3MyUexUFBmE50DUV5AnIvc3LIgk5Qem1b3g_Y_hlI43DxH6CiK4YjYHCMNZ0V0ExdF10JvoDw8ejGjg==', b'wrongpass')) 
except InvalidToken:
    print('Wrong password')

আপনি নিজের লবণ, পুনরাবৃত্তি গণনা ইত্যাদির সাথে খাপ খাইয়ে নিতে পারেন এই কোডটি @ এইচসি লাইভস এর উত্তর থেকে খুব বেশি দূরে নয় তবে লক্ষ্যটি প্রস্তুত encryptএবং ব্যবহারের জন্য প্রস্তুত রয়েছে decrypt। সূত্র: https://cryptography.io/en/latest/fernet/# using- passwords- with- fernet

দ্রষ্টব্য: ব্যবহার করুন .encode()এবং .decode()সর্বত্র আপনি 'John Doe'বাইটের পরিবর্তে স্ট্রিং চান b'John Doe'


2) Cryptoলাইব্রেরি সহ সাধারণ এইএস এনক্রিপশন

এটি পাইথন 3 এর সাথে কাজ করে:

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

def cipherAES(password, iv):
    key = SHA256.new(password).digest()
    return AES.new(key, AES.MODE_CFB, iv)

def encrypt2(plaintext, password):
    iv = Random.new().read(AES.block_size)
    return base64.b64encode(iv + cipherAES(password, iv).encrypt(plaintext))

def decrypt2(ciphertext, password):
    d = base64.b64decode(ciphertext)
    iv, ciphertext = d[:AES.block_size], d[AES.block_size:]
    return cipherAES(password, iv).decrypt(ciphertext)

# Example:    

print(encrypt2(b'John Doe', b'mypass'))
print(decrypt2(b'B/2dGPZTD8V22cIVKfp2gD2tTJG/UfP/', b'mypass'))
print(decrypt2(b'B/2dGPZTD8V22cIVKfp2gD2tTJG/UfP/', b'wrongpass'))  # wrong password: no error, but garbled output

দ্রষ্টব্য: আপনি মুছে ফেলতে পারেন base64.b64encodeএবং .b64decodeআপনি যদি পাঠ্য-পঠনযোগ্য আউটপুট না চান এবং / অথবা আপনি যে কোনও উপায়ে বাইনারি ফাইল হিসাবে সিফারেক্সটকে ডিস্কে সংরক্ষণ করতে চান।


3) AES আরও ভাল পাসওয়ার্ড কী ডেরাইভেশন ফাংশন এবং Cryptoলাইব্রেরি সহ "ভুল পাসওয়ার্ড প্রবেশ করানো হয়েছে" তা পরীক্ষার ক্ষমতা ব্যবহার করে

সমাধান 2) এইএস "সিএফবি মোড" সহ ঠিক আছে তবে এর দুটি ত্রুটি রয়েছে: SHA256(password)একটি অনুসন্ধান সারণীর সাহায্যে সহজেই আঘাত করা যেতে পারে এবং কোনও ভুল পাসওয়ার্ড প্রবেশ করানো হয়েছে কিনা তা পরীক্ষা করার উপায় নেই। এটি এখানে "জিসিএম মোড" এইএস এর ব্যবহার দ্বারা সমাধান করা হয়েছে, যেমন এটিতে আলোচনা করা হয়েছে : একটি খারাপ পাসওয়ার্ড প্রবেশ করানো হয়েছে তা কীভাবে সনাক্ত করব? এবং "আপনি যে পাসওয়ার্ডটি লিখেছেন তা ভুল" বলতে কি এই পদ্ধতিটি নিরাপদ? :

import Crypto.Random, Crypto.Protocol.KDF, Crypto.Cipher.AES

def cipherAES_GCM(pwd, nonce):
    key = Crypto.Protocol.KDF.PBKDF2(pwd, nonce, count=100000)
    return Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_GCM, nonce=nonce, mac_len=16)

def encrypt3(plaintext, password):
    nonce = Crypto.Random.new().read(16)
    return nonce + b''.join(cipherAES_GCM(password, nonce).encrypt_and_digest(plaintext))  # you case base64.b64encode it if needed

def decrypt3(ciphertext, password):
    nonce, ciphertext, tag = ciphertext[:16], ciphertext[16:len(ciphertext)-16], ciphertext[-16:]
    return cipherAES_GCM(password, nonce).decrypt_and_verify(ciphertext, tag)

# Example:

print(encrypt3(b'John Doe', b'mypass'))
print(decrypt3(b'\xbaN_\x90R\xdf\xa9\xc7\xd6\x16/\xbb!\xf5Q\xa9]\xe5\xa5\xaf\x81\xc3\n2e/("I\xb4\xab5\xa6ezu\x8c%\xa50', b'mypass'))
try:
    print(decrypt3(b'\xbaN_\x90R\xdf\xa9\xc7\xd6\x16/\xbb!\xf5Q\xa9]\xe5\xa5\xaf\x81\xc3\n2e/("I\xb4\xab5\xa6ezu\x8c%\xa50', b'wrongpass'))
except ValueError:
    print("Wrong password")

4) আরসি 4 ব্যবহার করে (কোনও লাইব্রেরির প্রয়োজন নেই)

Https://github.com/bozhu/RC4- পাইথন/blob/master/rc4.py থেকে অভিযোজিত ।

def PRGA(S):
    i = 0
    j = 0
    while True:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        yield S[(S[i] + S[j]) % 256]

def encryptRC4(plaintext, key, hexformat=False):
    key, plaintext = bytearray(key), bytearray(plaintext)  # necessary for py2, not for py3
    S = list(range(256))
    j = 0
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]
    keystream = PRGA(S)
    return b''.join(b"%02X" % (c ^ next(keystream)) for c in plaintext) if hexformat else bytearray(c ^ next(keystream) for c in plaintext)

print(encryptRC4(b'John Doe', b'mypass'))                           # b'\x88\xaf\xc1\x04\x8b\x98\x18\x9a'
print(encryptRC4(b'\x88\xaf\xc1\x04\x8b\x98\x18\x9a', b'mypass'))   # b'John Doe'

(সর্বশেষতম সম্পাদনাগুলির পরে পুরানো তবে ভবিষ্যতের রেফারেন্সের জন্য রেখেছি): উইন্ডোজ + পাইথন ৩.6 ব্যবহার করে আমার সমস্ত সমস্যা ছিল pycrypto( pip install pycryptoউইন্ডোজে সক্ষম নয় ) জড়িত সমস্ত উত্তর বা pycryptodome(এখানে উত্তরগুলি from Crypto.Cipher import XORব্যর্থ হয়েছে কারণ XORএই pycryptoকাঁটাচামচ দ্বারা সমর্থিত নয় ; এবং সমাধানগুলি ব্যবহার করে ... AESখুব ব্যর্থ হয়েছে TypeError: Object type <class 'str'> cannot be passed to C code)। এছাড়াও, গ্রন্থাগারের নির্ভরতা হিসাবে simple-cryptরয়েছে pycryptoতাই এটি কোনও বিকল্প নয়।


1
আপনি লবণ এবং পুনরাবৃত্তি গণনাগুলি হার্ডকোড করতে চান না; একটি এলোমেলো লবণ উত্পন্ন করুন এবং পুনরাবৃত্তি গণনাটিকে এনক্রিপশনে কনফিগারযোগ্য করে তুলুন, এনক্রিপশন ফলাফলের মধ্যে সেই তথ্য অন্তর্ভুক্ত করুন এবং ডিক্রিপশনটিতে মানগুলি বের করুন এবং ব্যবহার করুন। লবণ আপনাকে প্রদত্ত বার্তায় পুনঃব্যবহৃত পাসওয়ার্ডগুলির তুচ্ছ স্বীকৃতি থেকে সুরক্ষা দেয়, পুনরাবৃত্তিটি ভবিষ্যতের প্রমাণগুলি অ্যালগরিদম গণনা করে।
মার্টিজন পিটারস

হ্যাঁ অবশ্যই @ মার্তিজজনপিটারস, তবে ওপির অনুরোধ অনুসারে সাধারণ উদ্দেশ্যগুলির জন্য একটি সাধারণ কোডের জন্য এখানে দুটি পরামিতি রয়েছে : সরল পাঠ্য + পাসওয়ার্ড the অবশ্যই আরও জটিল দৃশ্যের জন্য (যেমন একটি ডাটাবেস), আপনি এই সমস্ত অতিরিক্ত পরামিতি ব্যবহার করবেন।
বাসজ

অতিরিক্ত প্যারামিটারের দরকার নেই! আমি অস্বচ্ছ রিটার্ন মানটিতে এনকোড হওয়া তথ্যটি অন্তর্ভুক্ত করেছি password_encrypt()
মার্টিজন পিটারস

পছন্দ করেছেন
বাস্জ

2

এটি কাজ করে তবে পাসওয়ার্ডের দৈর্ঘ্য হুবহু হওয়া উচিত 8। এটি সহজ এবং পাইডেস প্রয়োজন ।

from pyDes import *

def encode(data,password):
    k = des(password, CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
    d = k.encrypt(data)
    return d

def decode(data,password):
    k = des(password, CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
    d = k.decrypt(data)
    return d

x = encode('John Doe', 'mypass12')
y = decode(x,'mypass12')

print x
print y

আউটপুট:

³.\Þ\åS¾+æÅ`;Ê
John Doe

স্থির চতুর্থটি ব্যবহার করবেন না! চতুর্থ র্যান্ডমাইজ করুন এবং এর পরিবর্তে সিফারেক্সটসের সাথে এটি অন্তর্ভুক্ত করুন। অন্যথায় আপনি পাশাপাশি ইসিবি মোড ব্যবহার করতে পারেন; পুনরাবৃত্তি সরল পাঠ্য বার্তাগুলি অন্যথায় চিনতে তুচ্ছ।
মার্টিজন পিটারস

এছাড়াও, পাইডেস প্রকল্পটি মারা গেছে বলে মনে হচ্ছে; হোমপেজটি চলে গেছে, এবং পাইপআই-তে সর্বশেষ প্রকাশের বয়স এখন 9 বছর।
মার্টিজন পিটারস

2

@ ক্নিল কোডের অন্য একটি বাস্তবায়ন যা মূল বার্তায় সিআরসি চেকসাম অন্তর্ভুক্ত করে, যদি চেকটি ব্যর্থ হয় তবে এটি ব্যতিক্রম করে:

import hashlib
import struct
import zlib

def vigenere_encode(text, key):
    text = '{}{}'.format(text, struct.pack('i', zlib.crc32(text)))

    enc = []
    for i in range(len(text)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(text[i]) + ord(key_c)) % 256)
        enc.append(enc_c)

    return base64.urlsafe_b64encode("".join(enc))


def vigenere_decode(encoded_text, key):
    dec = []
    encoded_text = base64.urlsafe_b64decode(encoded_text)
    for i in range(len(encoded_text)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(encoded_text[i]) - ord(key_c)) % 256)
        dec.append(dec_c)

    dec = "".join(dec)
    checksum = dec[-4:]
    dec = dec[:-4]

    assert zlib.crc32(dec) == struct.unpack('i', checksum)[0], 'Decode Checksum Error'

    return dec

2

আপনি পাসওয়ার্ড দিয়ে আপনার স্ট্রিং এনক্রিপ্ট করতে AES ব্যবহার করতে পারেন। যদিও, আপনি একটি শক্তিশালী পর্যাপ্ত পাসওয়ার্ড বেছে নিতে চাইবেন যাতে লোকে সহজেই এটি কী তা অনুমান করতে পারে না (দুঃখিত আমি এটি সাহায্য করতে পারি না I'm

AES একটি ভাল কী আকারের সাথে শক্তিশালী তবে পাইক্রিপ্টো দিয়ে এটি ব্যবহার করাও সহজ।


3
ধন্যবাদ অ্যালান তবে স্পষ্টতার জন্য, আমি নিজেরাই পাসওয়ার্ডগুলি এনক্রিপ্ট করছি না। উপরের উদাহরণে, আমি "জন দো" স্ট্রিংটি পাসওয়ার্ড "মাইপাস" অনুসারে এনক্রিপ্ট করছি, যা আমার সোর্স কোডে আমি ব্যবহার করি এমন একটি সাধারণ পাসওয়ার্ড। ব্যবহারকারীর পাসওয়ার্ড জড়িত নয়, অন্য কোনও সংবেদনশীল তথ্যও নয়। এটি পরিষ্কার করার জন্য আমি আমার প্রশ্ন সম্পাদনা করেছি।
রেক্সেক্স

1
AES দুর্দান্ত, যদি সঠিকভাবে ব্যবহার করা হয়। এটি তবে ভুলভাবে ব্যবহার করা সহজ; এখানে কমপক্ষে একটি উত্তর রয়েছে যা একটি অনিরাপদ ব্লক সাইফার মোড ব্যবহার করে, অন্য দুটি যা আইভি মানটি পরিচালনা করতে ভুগবে। ফার্নেটের মতো সু-সংজ্ঞায়িত রেসিপি সহ একটি ভাল গ্রন্থাগার ব্যবহার করা আরও ভাল!
মার্টিজন পিটারস

আসলে, এটি খুব চমত্কার পর্যবেক্ষণ আমি একবার চতুর্থ ভাবি।
অ্যালান

0

বাহ্যিক গ্রন্থাগারগুলি গোপন-কী এনক্রিপশন অ্যালগরিদম সরবরাহ করে।

উদাহরণস্বরূপ, Cypherপাইক্রিপ্টো-তে মডিউলটি অনেক এনক্রিপশন অ্যালগরিদমের একটি নির্বাচন প্রস্তাব করে:

  • Crypto.Cipher.AES
  • Crypto.Cipher.ARC2
  • Crypto.Cipher.ARC4
  • Crypto.Cipher.Blowfish
  • Crypto.Cipher.CAST
  • Crypto.Cipher.DES
  • Crypto.Cipher.DES3
  • Crypto.Cipher.IDEA
  • Crypto.Cipher.RC5
  • Crypto.Cipher.XOR

MeTooCrypto ওপেনএসএসএল এর একটি Pythonমোড়ক , এবং (অন্যান্য ফাংশনগুলির মধ্যে) একটি পূর্ণ-শক্তি সাধারণ উদ্দেশ্যে ক্রিপ্টোগ্রাফি লাইব্রেরি সরবরাহ করে। অন্তর্ভুক্ত রয়েছে প্রতিসম সাইফারগুলি (যেমন এইএস)।


0

আপনি যদি নিরাপদ এনক্রিপশন চান:

অজগর 2 এর জন্য আপনার কীকজার ব্যবহার করা উচিত http://www.keyczar.org/

পাইথন 3-এর জন্য, কীসজারটি পাওয়া না যাওয়া পর্যন্ত আমি সিম্পল-ক্রিপ্ট লিখেছি http://pypi.python.org/pypi/simple-crypt

এই উভয়ই মূল জোরদার ব্যবহার করবে যা এখানকার অন্যান্য উত্তরগুলির তুলনায় এগুলিকে আরও সুরক্ষিত করে। এবং যেহেতু এগুলি ব্যবহার করা এত সহজ তাই আপনি সুরক্ষা নাও থাকলেও সেগুলি ব্যবহার করতে পারেন ...


থেকে Keyczar সংগ্রহস্থলের : গুরুত্বপূর্ণ টীকা: Keyczar অসমর্থিত হয়েছে। Keyczar ডেভেলপারদের সুপারিশ Tink , কিন্তু Tink কোন পাইথন সংস্করণ।
মার্টিজন পিটারস

0

সুতরাং, সমালোচনামূলকভাবে কোনও মিশন এনকোড করা হচ্ছে না এবং আপনি কেবল অস্পষ্টতার জন্য এনক্রিপ্ট করতে চান ।

আমাকে সিজার সিফার উপস্থাপন করুন

এখানে চিত্র বর্ণনা লিখুন

সিজারের সাইফার বা সিজার শিফট, অন্যতম সহজ এবং বহুল পরিচিত এনক্রিপশন কৌশল। এটি একধরনের সাবস্টিটিউশন সাইফার যেখানে বর্ণমালার প্রতিটি অক্ষর বর্ণের পরিবর্তে কিছু নির্দিষ্ট সংখ্যক অবস্থানের অক্ষর দ্বারা প্রতিস্থাপিত হয়। উদাহরণস্বরূপ, 3 এর বাম শিফট দিয়ে, ডি এর পরিবর্তে এ দ্বারা পরিবর্তিত হবে, ই বি হয়ে যাবে, ইত্যাদি।

আপনার রেফারেন্সের জন্য নমুনা কোড:

def encrypt(text,s): 
        result = "" 

        # traverse text 
        for i in range(len(text)): 
            char = text[i] 

            # Encrypt uppercase characters 
            if (char.isupper()): 
                result += chr((ord(char) + s-65) % 26 + 65) 

            # Encrypt lowercase characters 
            else: 
                result += chr((ord(char) + s - 97) % 26 + 97) 

        return result 

    def decrypt(text,s): 
        result = "" 

        # traverse text 
        for i in range(len(text)): 
            char = text[i] 

            # Encrypt uppercase characters 
            if (char.isupper()): 
                result += chr((ord(char) - s-65) % 26 + 65) 

            # Encrypt lowercase characters 
            else: 
                result += chr((ord(char) - s - 97) % 26 + 97) 

        return result 

    #check the above function 
    text = "ATTACKATONCE"
    s = 4
    print("Text  : " + text) 
    print("Shift : " + str(s)) 
    print("Cipher: " + encrypt(text,s))
    print("Original text: " + decrypt(encrypt(text,s),s))

সুবিধাগুলি: এটি আপনার প্রয়োজনীয়তা পূরণ করে এবং সহজ এবং এনকোডিং জিনিস'ই করে।

অসুবিধা: সাধারণ ব্রুট ফোর্স অ্যালগরিদম দ্বারা ক্র্যাক করা যেতে পারে (অত্যন্ত সম্ভাব্য কেউই সমস্ত অতিরিক্ত ফলাফলের মধ্য দিয়ে যাওয়ার চেষ্টা করবে)।


0

ডিকোড সহ আরও একটি কোড যুক্ত করা হচ্ছে এবং রেফারেন্সের জন্য এনকোড

import base64

def encode(key, string):
    encoded_chars = []
    for i in range(len(string)):
        key_c = key[i % len(key)]
        encoded_c = chr(ord(string[i]) + ord(key_c) % 128)
        encoded_chars.append(encoded_c)
    encoded_string = "".join(encoded_chars)
    arr2 = bytes(encoded_string, 'utf-8')
    return base64.urlsafe_b64encode(arr2)

def decode(key, string):
    encoded_chars = []
    string = base64.urlsafe_b64decode(string)
    string = string.decode('utf-8')
    for i in range(len(string)):
        key_c = key[i % len(key)]
        encoded_c = chr(ord(string[i]) - ord(key_c) % 128)
        encoded_chars.append(encoded_c)
    encoded_string = "".join(encoded_chars)
    return encoded_string

def main():
    answer = str(input("EorD"))
    if(answer in ['E']):
        #ENCODE
        file = open("D:\enc.txt")
        line = file.read().replace("\n", " NEWLINEHERE ")
        file.close()
        text = encode("4114458",line)
        fnew = open("D:\\new.txt","w+")
        fnew.write(text.decode('utf-8'))
        fnew.close()
    else:
        #DECODE
        file = open("D:\\new.txt",'r+')
        eline = file.read().replace("NEWLINEHERE","\n")
        file.close()
        print(eline)
        eline = eline.encode('utf-8')
        dtext=decode("4114458",eline)
        print(dtext)
        fnew = open("D:\\newde.txt","w+")
        fnew.write(dtext)
        fnew.close

if __name__ == '__main__':
    main()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.