পাইথন: বেস 64 ডিকোডিংয়ের সময় 'ভুল প্যাডিং' ত্রুটি উপেক্ষা করুন


111

আমার কাছে এমন কিছু ডেটা রয়েছে যা বেস64 এ এনকোড করা আছে যা আমি বাইনারিতে আবার রূপান্তর করতে চাই এমনকি তাতে কোনও প্যাডিংয়ের ত্রুটি থাকলেও। যদি আমি ব্যবহার করি

base64.decodestring(b64_string)

এটি একটি 'ভুল প্যাডিং' ত্রুটি উত্থাপন করে। অন্য উপায় আছে?

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

openssl enc -d -base64 -in b64string -out binary_data

5
আপনি আসলে কি করে দেখুন ব্যবহার base64.b64decode(strg, '-_')? এটি কোনও অগ্রাধিকার, আপনি কোনও নমুনা ডেটা সরবরাহ করার জন্য বিরক্ত না করেই আপনার সমস্যার সম্ভবত পাইথন সমাধান। প্রস্তাবিত "পদ্ধতিগুলি" হ'ল ডিবুগের পরামর্শ, সরবরাহিত তথ্যের অভাবের কারণে প্রয়োজনীয় "হিট অ্যান্ড মিস"।
জন মাচিন

2
@ জন মাচিন: হ্যাঁ, আমি আপনার পদ্ধতির চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি। তথ্য গোপনীয় সংস্থা।
FunLovinCoder

3
চেষ্টা করুনbase64.urlsafe_b64decode(s)
ড্যানিয়েল এফ

আপনি কি এর আউটপুট সরবরাহ করতে পারেন: sorted(list(set(b64_string)))দয়া করে? সংস্থা-গোপনীয় কোনও কিছুই প্রকাশ না করেই, এটি প্রকাশ করতে পারে যে কোন অক্ষরগুলি মূল ডেটা এনকোড করতে ব্যবহৃত হয়েছিল, যার ফলে কোনও হিট-মিস-মিস সমাধান সরবরাহ করার জন্য পর্যাপ্ত তথ্য সরবরাহ করতে পারে।
ব্রায়ান কার্সিচ

হ্যাঁ, আমি জানি এটি ইতিমধ্যে সমাধান হয়েছে, তবে সত্যি কথা বলতে, ওপেনসেল সমাধানটি আমার কাছে হিট-অর-মিসও বলে মনে হয়।
ব্রায়ান কার্সিচ

উত্তর:


79

অন্যান্য প্রতিক্রিয়াগুলিতে যেমন বলা হয়েছে, এখানে বিভিন্ন উপায় রয়েছে যেখানে বেস 64 ডেটা দূষিত হতে পারে।

তবে উইকিপিডিয়া যেমন বলেছে, প্যাডিংগুলি (বেস 64 এনকোডড ডেটার শেষে '=' অক্ষরগুলি) সরিয়ে ফেলা "ক্ষতিহীন":

একটি তাত্ত্বিক দৃষ্টিকোণ থেকে, প্যাডিং চরিত্রের প্রয়োজন হয় না, যেহেতু অনুপস্থিত বাইটের সংখ্যা বেস 64 এর সংখ্যা থেকে গণনা করা যায়।

সুতরাং আপনার বেস 64 ডেটার সাথে যদি এটি সত্যিই একমাত্র জিনিস "ভুল" হয় তবে প্যাডিংটি কেবল আবার যুক্ত করা যায়। আমি ওয়েসি প্রিন্টে "ডেটা" ইউআরএলগুলি পার্স করতে সক্ষম হয়ে এলাম, যার কয়েকটি বেসড ছাড়া বেস 64 ছিল:

import base64
import re

def decode_base64(data, altchars=b'+/'):
    """Decode base64, padding being optional.

    :param data: Base64 data as an ASCII byte string
    :returns: The decoded byte string.

    """
    data = re.sub(rb'[^a-zA-Z0-9%s]+' % altchars, b'', data)  # normalize
    missing_padding = len(data) % 4
    if missing_padding:
        data += b'='* (4 - missing_padding)
    return base64.b64decode(data, altchars)

এই ফাংশনটির জন্য পরীক্ষাগুলি : ওয়েজপ্রিন্ট / টেস্টস / টেস্ট_সিএস.পি. # এল 68


2
দ্রষ্টব্য: ASCII ইউনিকোড নয়, তাই নিরাপদ থাকতে আপনি চাইলে করতে পারেনstr(data)
MarkHu

4
এটি একটি সতর্কতার সাথে ভাল। base64.decodestring অবচিত করা হয়েছে, base64.b64_decode ব্যবহার করুন
ariddell

2
@ এরিডডেলের উপর স্পষ্ট করতে মন্তব্যটি পাই 3 তে নষ্ট base64.decodestringহয়েছে base64.decodebytesতবে সংস্করণ সামঞ্জস্যের জন্য আরও ভাল ব্যবহার করা base64.b64decode
ক্যাস

কারণ base64মডিউল ইনপুট অবৈধ অ করুন Base64- অক্ষর উপেক্ষা করে, আপনাকে প্রথমে আছে স্বাভাবিক ডেটা। কোনও চিঠি, অঙ্ক /বা নয় এমন কোনও কিছু সরিয়ে ফেলুন +এবং তারপরে প্যাডিং যুক্ত করুন।
মার্টিজন পিটারস

39

প্রয়োজন অনুসারে কেবল প্যাডিং যুক্ত করুন। মাইকেলের সতর্কতা, তবে মনোযোগ দিন।

b64_string += "=" * ((4 - len(b64_string) % 4) % 4) #ugh

1
এখানে অবশ্যই সহজ কিছু আছে যা 0 থেকে 0, 2 থেকে 1 এবং 1 থেকে 2 পর্যন্ত মানচিত্র করে
Badp

2
আপনি কেন 4 এর পরিবর্তে 3 এর একাধিকতে প্রসারিত করছেন?
মাইকেল মরোজেক

বেস 64 এর উইকিপিডিয়া নিবন্ধটি এটিকে বোঝায়।
Badp

1
@bp: বেস 64 এঙ্কোডিংয়ে প্রতিটি 24 বিট (3 বাইট) বাইনারি ইনপুট 4 বাইট আউটপুট হিসাবে এনকোড করা হয় আউটপুট_লেন% 3 কোনও মানে করে না।
জন মাচিন

8
শুধু সংযোজন ===সবসময় কাজ করে। যে কোনও অতিরিক্ত =চরিত্রগুলি পাইথন দ্বারা নিরাপদে ফেলে দেওয়া হয়েছে।
একিউম্যানাস

32

দেখে মনে হচ্ছে ডিকোডিংয়ের আগে আপনার বাইটে প্যাডিং যুক্ত করা দরকার। এই প্রশ্নে আরও অনেক উত্তর রয়েছে, তবে আমি এটি উল্লেখ করতে চাই যে (কমপক্ষে পাইথন 3.x এ) base64.b64decodeযে কোনও অতিরিক্ত প্যাডিং কেটে ফেলবে, প্রথম পর্যায়ে পর্যাপ্ত পরিমাণ রয়েছে।

সুতরাং, এর মতো কিছু: b'abc='ঠিক যেমন কাজ b'abc=='করে (যেমনটি হয় b'abc=====')।

এর অর্থ হ'ল আপনি কেবলমাত্র সর্বাধিক সংখ্যক প্যাডিং অক্ষর যুক্ত করতে পারেন যা আপনার প্রয়োজন হবে - যা তিনটি ( b'===') এবং বেস 64 কোনও অপ্রয়োজনীয় অক্ষয়কে কেটে ফেলবে।

এটি আপনাকে লিখতে দেয়:

base64.b64decode(s + b'===')

যা এর চেয়ে সহজ:

base64.b64decode(s + b'=' * (-len(s) % 4))

1
ঠিক আছে এটি খুব "কুশ্রী" ধন্যবাদ নয় :) আমি মনে করি যে আপনাকে কখনই 2 টির বেশি প্যাডিং চর প্রয়োজন হবে না। বেস 64 অ্যালগরিদম একবারে 3 টি চরের গ্রুপে কাজ করে এবং কেবলমাত্র আপনার শেষ গ্রুপের অক্ষর 1 বা 2 অক্ষরের দৈর্ঘ্যের হলে কেবল প্যাডিং প্রয়োজন।
অটো

@ এখানে প্যাডিংটি ডিকোডিংয়ের জন্য যা 4 টি গ্রুপের গ্রুপে কাজ করে। বেস 64 এনকোডিং 3 টি গ্রুপের গ্রুপগুলিতে কাজ করে :)
হেনরি উডি

তবে আপনি যদি জানেন যে এনকোডিংয়ের সময় সর্বাধিক 2 টি যুক্ত হবে, যা পরে "হারিয়ে যেতে" পারে, আপনাকে ডিকোডিংয়ের আগে এগুলি পুনরায় যুক্ত করতে বাধ্য করে, তবে আপনি জানেন যে ডিকোডিংয়ের সময় আপনাকে কেবলমাত্র সর্বোচ্চ 2 টি যুক্ত করতে হবে। # ক্রিসমাসটাইমআগ্রিমেন্টের জন্যফুনঅফআইটি
অটো

@ তবে আমি বিশ্বাস করি আপনি ঠিক বলেছেন। দৈর্ঘ্য সহ বেস 64৪ টি এনকোড স্ট্রিং থাকা অবস্থায়, উদাহরণস্বরূপ, 5 এর জন্য 3 টি প্যাডিং অক্ষর প্রয়োজন হবে, 5 দৈর্ঘ্যের একটি স্ট্রিং একটি বেস 64 এনকোড স্ট্রিংয়ের জন্য একটি বৈধ দৈর্ঘ্যও নয়। আপনি ত্রুটি পেতে চাই: binascii.Error: Invalid base64-encoded string: number of data characters (5) cannot be 1 more than a multiple of 4। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ!
হেনরি উডি

24

"ভুল প্যাডিং" এর অর্থ কেবল "নিখোঁজ প্যাডিং" নয়, তবে এটি বিশ্বাস করুন (বিশ্বাস করুন বা নাও) "ভুল প্যাডিং"।

যদি পরামর্শ দেওয়া হয় "প্যাডিং যোগ করার" পদ্ধতিগুলি কাজ করে না, তবে কিছু ট্রেলিং বাইটগুলি সরিয়ে চেষ্টা করুন:

lens = len(strg)
lenx = lens - (lens % 4 if lens % 4 else 4)
try:
    result = base64.decodestring(strg[:lenx])
except etc

আপডেট: প্যাডিং যুক্ত করা বা শেষ থেকে সম্ভবত খারাপ বাইটগুলি অপসারণের চারপাশে যে কোনও ফিডলিং করা উচিত কোনও সাদা স্থান সরিয়ে নেওয়ার পরে করা উচিত, অন্যথায় দৈর্ঘ্যের গণনাগুলি বিচলিত হবে।

আপনি যদি আমাদের পুনরুদ্ধার করার জন্য প্রয়োজনীয় ডেটার একটি (সংক্ষিপ্ত) নমুনা দেখান তবে এটি ভাল ধারণা হবে। আপনার প্রশ্নটি সম্পাদনা করুন এবং এর ফলাফলটি অনুলিপি / অনুলিপি করুন print repr(sample)

আপডেট 2: এটি সম্ভব যে এনকোডিংটি একটি url- সুরক্ষিত পদ্ধতিতে করা হয়েছে। যদি এটি হয় তবে আপনি আপনার ডেটাতে বিয়োগ এবং আন্ডারস্কোর অক্ষর দেখতে সক্ষম হবেন এবং এটি ব্যবহার করে আপনি এটি ডিকোড করতে সক্ষম হবেনbase64.b64decode(strg, '-_')

আপনি যদি আপনার ডেটাতে বিয়োগ এবং আন্ডারস্কোর অক্ষর দেখতে না পান তবে প্লাস এবং স্ল্যাশ অক্ষরগুলি দেখতে পারেন তবে আপনার আরও কিছু সমস্যা আছে এবং অ্যাড-প্যাডিং বা অপসারণ-ক্রাফ্ট ট্রিকগুলির প্রয়োজন হতে পারে।

আপনি যদি আপনার ডেটাতে বিয়োগ, আন্ডারস্কোর, প্লাস এবং স্ল্যাশের কোনও কিছুই দেখতে না পান তবে আপনাকে দুটি বিকল্প অক্ষর নির্ধারণ করতে হবে; তারা হ'ল [এ-জা-জেড -00 -9] এ নয়। তারপরে আপনাকে দ্বিতীয় ক্রমে কী অর্ডারটি ব্যবহার করতে হবে তা পরীক্ষা করতে হবেbase64.b64decode()

আপডেট 3 : আপনার ডেটা "কোম্পানী গোপনীয়" হয় এমন:
(ক) আপনি তাই বলে সামনে উচিত
(খ) আমরা সমস্যাটি, যা অত্যন্ত সম্ভবত কি অক্ষরের পরিবর্তে ব্যবহার করা হয় এর সাথে সম্পর্কিত করা বুঝতে অন্যান্য পন্থায় অন্বেষণ করতে পারবেন +এবং /এ এনকোডিং বর্ণমালা, বা অন্য ফর্ম্যাটিং বা বহিরাগত অক্ষর দ্বারা।

এই জাতীয় একটি উপায়ে আপনার ডেটাতে অ-"মানক" অক্ষরগুলি কী তা পরীক্ষা করা হবে eg

from collections import defaultdict
d = defaultdict(int)
import string
s = set(string.ascii_letters + string.digits)
for c in your_data:
   if c not in s:
      d[c] += 1
print d

তথ্যটি স্ট্যান্ডার্ড বেস 64 অক্ষর সেট থেকে গঠিত comp আমি নিশ্চিত যে সমস্যাটি কারণ 1 বা ততোধিক অক্ষর নেই - তাই প্যাডিংয়ের ত্রুটি। পাইথনে শক্ত সমাধান না হলে আমি ওপেনসেল কল করার সমাধানটি নিয়ে যাব।
ফানলোভিনকোডার

1
একটি "সমাধান" যা নিঃশব্দে ত্রুটিগুলি উপেক্ষা করে তা "মজবুত" শব্দটির খুব কমই যোগ্য। যেমনটি আমি আগেই উল্লেখ করেছি, পাইথনের বিভিন্ন পরামর্শ হ'ল সমস্যাটি কী তা আবিষ্কার করার জন্য ডিবাগিংয়ের পদ্ধতিগুলি, একটি PRINCIPLED সমাধানের প্রস্তুতিমূলক ... আপনি কি এ জাতীয় বিষয়ে আগ্রহী নন?
জন মাচিন

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

স্ট্রিংটি কেবলমাত্র স্বাভাবিক করুন, এমন কোনও কিছু সরান যা বেস 64 অক্ষর নয়। যে কোনও জায়গায়, কেবল শুরু বা শেষ নয়।
মার্টিজন পিটারস

24

ব্যবহার

string += '=' * (-len(string) % 4)  # restore stripped '='s

ক্রেডিট এখানে কোথাও একটি মন্তব্য যায়।

>>> import base64

>>> enc = base64.b64encode('1')

>>> enc
>>> 'MQ=='

>>> base64.b64decode(enc)
>>> '1'

>>> enc = enc.rstrip('=')

>>> enc
>>> 'MQ'

>>> base64.b64decode(enc)
...
TypeError: Incorrect padding

>>> base64.b64decode(enc + '=' * (-len(enc) % 4))
>>> '1'

>>> 

4
তিনি এই মন্তব্যটি মানে stackoverflow.com/questions/2941995/...
jackyalcine

22

যদি কোনও প্যাডিং ত্রুটি থাকে তবে এর অর্থ সম্ভবত আপনার স্ট্রিংটি নষ্ট হয়ে গেছে; বেস 64-এনকোডযুক্ত স্ট্রিংগুলির দৈর্ঘ্যের একাধিক হওয়া উচিত। =স্ট্রিংকে চারটির একাধিক করার জন্য আপনি নিজেই প্যাডিং চরিত্রটি যুক্ত করতে চেষ্টা করতে পারেন তবে কিছু ভুল না হলে এটি ইতিমধ্যে থাকা উচিত


অন্তর্নিহিত বাইনারি ডেটা ASN.1 N এমনকি দুর্নীতির সাথে আমি বাইনারিটিতে ফিরে যেতে চাই কারণ আমি এখনও এএসএন 1 স্ট্রিম থেকে কিছু দরকারী তথ্য পেতে পারি।
FunLovinCoder

সত্য নয়, আপনি যদি নিরাপত্তা সম্পর্কিত পরীক্ষাগুলি একটি jwt ডিকোড করতে চান, আপনি এটির প্রয়োজন হতে পারে
DAG

4

আপনি ডিকোড করার চেষ্টা করছেন এমন ডেটা উত্সের ডকুমেন্টেশন পরীক্ষা করুন। আপনি কি base64.urlsafe_b64decode(s)পরিবর্তে এটি ব্যবহার করতে চান তা সম্ভব base64.b64decode(s)? এটির একটি কারণ আপনি সম্ভবত এই ত্রুটি বার্তাটি দেখেছেন।

ডিকোড স্ট্রিংগুলি একটি ইউআরএল-নিরাপদ বর্ণমালা ব্যবহার করে, যা বিকল্প +64 এর বর্ণমালার পরিবর্তে / এবং _ এর পরিবর্তে - পরিবর্তিত হয়।

এটি উদাহরণস্বরূপ গুগলের আইডেন্টিটি টুলকিট এবং জিমেইল পে-লোডের মতো বিভিন্ন গুগল এপিআইয়ের ক্ষেত্রে case


1
এটি প্রশ্নের কোনও উত্তর দেয় না। urlsafe_b64decodeএছাড়াও , প্যাডিং প্রয়োজন।
rdb

ঠিক আছে, এই প্রশ্নের উত্তর দেওয়ার আগে আমার একটি সমস্যা ছিল, যা গুগলের আইডেন্টিটি টুলকিটের সাথে সম্পর্কিত ছিল। আমি ভুল প্যাডিংয়ের ত্রুটি পাচ্ছিলাম (আমার বিশ্বাস এটি সার্ভারে ছিল) এমনকি প্যাডিংটি সঠিক বলে মনে হয়েছিল। আমার ব্যবহার করতে হবে যে পরিণত base64.urlsafe_b64decode
ড্যানিয়েল এফ

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

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

এই উত্তরটি JWT থেকে প্রাপ্ত Google অ্যাক্সেস টোকনকে ডিকোডিং করে আমার সমস্যার সমাধান করেছে। অন্যান্য সমস্ত প্রচেষ্টা "ভুল প্যাডিং" এর ফলস্বরূপ।
জন হ্যানলি

2

প্যাডিং যুক্ত করা বরং ... স্পষ্টভাবে। এই ফাংশনটি আমি এই থ্রেডের মন্তব্যের পাশাপাশি বেস 64 এর উইকি পৃষ্ঠার সাহায্যে লিখেছি (এটি আশ্চর্যজনকভাবে সহায়ক) https://en.wikedia.org/wiki/Base64# পেডিং ।

import logging
import base64
def base64_decode(s):
    """Add missing padding to string and return the decoded base64 string."""
    log = logging.getLogger()
    s = str(s).strip()
    try:
        return base64.b64decode(s)
    except TypeError:
        padding = len(s) % 4
        if padding == 1:
            log.error("Invalid base64 string: {}".format(s))
            return ''
        elif padding == 2:
            s += b'=='
        elif padding == 3:
            s += b'='
        return base64.b64decode(s)

2

আপনি base64.urlsafe_b64decode(data)যদি কোনও ওয়েব চিত্রকে ডিকোড করার চেষ্টা করছেন তবে আপনি সহজেই ব্যবহার করতে পারেন। এটি স্বয়ংক্রিয়ভাবে প্যাডিংয়ের যত্ন নেবে।


এটা সত্যিই সাহায্য করে!
চাঁদ

1

সেখানে সংশোধন করার ইনপুট ডেটা পাইথন মডিউল করুন Base64- এর b64decode পদ্ধতি ইনপুট ডেটা প্রক্রিয়া করতে সক্ষম করতে এখানে বর্ণিত, বা, আরো নির্দিষ্টভাবে এবং ও.পি. সঙ্গে সঙ্গতিপূর্ণ, দুটি উপায় আছে কিছু একটি অ-ধরা ব্যতিক্রম উত্থাপন ছাড়াই:

  1. ইনপুট ডেটার শেষে কল করুন == বেস 64.b64 ডিকোড (...) কল করুন
  2. যদি এটি একটি ব্যতিক্রম উত্থাপন করে, তবে

    আমি। চেষ্টা করে / বাদে এটি ধরুন,

    আ। (আর?) ইনপুট ডেটা থেকে কোনও = অক্ষর স্ট্রিপ করুন (এনবি এটির প্রয়োজন নাও হতে পারে),

    III। ইনপুট ডেটাতে A == যুক্ত করুন (A == পি == মাধ্যমে কাজ করবে),

    ঈ। বেস এ 64.b64decode (...) - এ A == - সংযুক্ত ইনপুট ডেটার সাথে কল করুন

উপরের আইটেম 1 বা আইটেম 2 থেকে ফলাফল পছন্দসই ফলাফল দেবে।

আদেশ সহকারে

এটি গ্যারান্টি দেয় না যে ডিকোডযুক্ত ফলাফলটি মূলত যা এনকোড করা হয়েছিল, তবে এটি (কখনও কখনও?) ওপিকে কাজ করার জন্য যথেষ্ট পরিমাণে দেবে:

এমনকি দুর্নীতির সাথেও আমি বাইনারিটিতে ফিরে যেতে চাই কারণ আমি এখনও এএসএন 1 স্ট্রিম থেকে কিছু দরকারী তথ্য পেতে পারি ")।

দেখুন আমরা কি জানি এবং অনুমিতি নিচে।

টি এল; ডিআর

বেস 64.b64decode (...) এর কয়েকটি দ্রুত পরীক্ষা থেকে

  1. এটি প্রদর্শিত হয় যে এটি অ- [A-Za-z0-9 + /] অক্ষর উপেক্ষা করে; এতে চারটি পার্স করা গোষ্ঠীতে শেষ অক্ষর (গুলি) না থাকলে সেগুলিকে উপেক্ষা করা অন্তর্ভুক্ত রয়েছে , যার ক্ষেত্রে = গুলি ডিকোডিংটি সমাপ্ত করে (a = b = c = d = abc =, এবং a = হিসাবে একই ফলাফল দেয়) = খ == সি == এব ==) এর একই ফলাফল দেয়।

  2. এটিতে আরও উপস্থিত হয় যে সংযুক্ত সমস্ত অক্ষর বিন্দুটির পরে উপেক্ষা করা হবে যেখানে base64.b64decode (...) গ্রুপের চতুর্থ হিসাবে একটি = থেকে ডিকোডিং সমাপ্ত করে।

উপরের বেশ কয়েকটি মন্তব্যে উল্লিখিত হিসাবে, শূন্য, বা এক, বা দুটি, = গুলি প্যাডিং প্রয়োজন হয় ইনপুট ডেটার শেষে যখন [সেই বিন্দুতে বিভক্ত অক্ষরের সংখ্যা] 4, মান 0 বা 3 হয়, বা যথাক্রমে 2। সুতরাং, উপরের আইটেম 3 এবং 4 থেকে, ইনপুট ডেটাতে দুই বা ততোধিক = গুলি যুক্ত করা সেই ক্ষেত্রে যে কোনও [ভুল প্যাডিং] সমস্যা সংশোধন করবে।

তবুও, ডিকোডিং সেই ক্ষেত্রে পরিচালনা করতে পারে না যেখানে [পার্সড অক্ষরগুলির মোট সংখ্যা 4] 1 হয়, কারণ তিনটি ডিকোডড বাইটের একটি গ্রুপে প্রথম ডিকোডেড বাইট উপস্থাপন করতে কমপক্ষে দুটি এনকোডযুক্ত অক্ষর লাগে। ইন উন এনকোডেড ইনপুট ডেটা নষ্ট, এই [n modulo 4] = 1 ক্ষেত্রে কখনো ঘটে, কিন্তু ওপি বলেছেন যে অক্ষর অনুপস্থিত হতে পারে যেমন, এটা এখানে ঘটতে পারে। এটা কেন কেবল সংযোজন = গুলি করবে সব সময় নয় কাজ, এবং কেন সংযোজন হয় একটি == যখন সংযোজন == না কাজ করবে। এনবি ব্যবহার করে [এ] সবই স্বেচ্ছাসেবক: এটি ডিকোডডের সাথে কেবল সাফ (শূন্য) বিট যুক্ত করে, যা সঠিক বা সঠিক নাও হতে পারে, তবে এখানে বস্তুটি নির্ভুলতা নয় তবে বেস 64.b64decode (...) দ্বারা ব্যতিক্রম সংঘটিত হয় না ।

আমরা ওপি থেকে যা জানি এবং বিশেষত পরবর্তী মন্তব্যগুলি তা

  • এটি সন্দেহ করা হয় যে বেস 64-এনকোডড ইনপুট ডেটাতে ডেটা (অক্ষর) নেই
  • বেস 64 এনকোডিংটি স্ট্যান্ডার্ড 64 প্লেস-ভ্যালু প্লাস প্যাডিং ব্যবহার করে: এজেড; AZ; 0-9; + +; /; = প্যাডিং হয়। এটি নিশ্চিত, বা কমপক্ষে পরামর্শ দেওয়া হয়েছে, এটি openssl enc ...কাজ করে এমন সত্য দ্বারা ।

অনুমিতি

  • ইনপুট ডেটাতে মাত্র 7-বিট ASCII ডেটা থাকে
  • একমাত্র ধরণের দুর্নীতির মধ্যে এনকোডযুক্ত ইনপুট ডেটা নেই
  • ওপিতে কোনও অনুপস্থিত এনকোডড ইনপুট ডেটার সাথে সম্পর্কিত হওয়ার পরে কোনও বিন্দুতে ডিকোড হওয়া আউটপুট ডেটার বিষয়ে যত্ন নেই

GitHub

এই সমাধানটি বাস্তবায়নের জন্য এখানে একটি মোড়ক দেওয়া হচ্ছে:

https://github.com/drbitboy/missing_b64


1

ভুল প্যাডিংয়ের ত্রুটি দেখা দেয় কারণ কখনও কখনও, এনকোডড স্ট্রিংয়ে মেটাটাটাও উপস্থিত থাকে যদি আপনার স্ট্রিংটিকে এমন কিছু দেখায়: 'ডেটা: চিত্র / পিএনজি; বেস 64, ... বেস 64 স্টাফ ....' তবে আপনাকে প্রথমে অপসারণ করতে হবে এটি ডিকোড করার আগে অংশ।

বলুন যদি আপনার কাছে চিত্র বেস 64 এনকোডড স্ট্রিং রয়েছে তবে স্নিপেটের নীচে চেষ্টা করুন ..

from PIL import Image
from io import BytesIO
from base64 import b64decode
imagestr = 'data:image/png;base64,...base 64 stuff....'
im = Image.open(BytesIO(b64decode(imagestr.split(',')[1])))
im.save("image.png")

0

লক্ষ্যযুক্ত স্ট্রিংয়ের মানটি ডিকোড করার চেষ্টা করার আগে কেবল "=" বা অন্য যে কোনও অতিরিক্ত অক্ষর যুক্ত করুন এবং এটিকে 4 এর একাধিক করুন। কিছুটা এইরকম;

if len(value) % 4 != 0: #check if multiple of 4
    while len(value) % 4 != 0:
        value = value + "="
    req_str = base64.b64decode(value)
else:
    req_str = base64.b64decode(value)

0

কোনও ওয়েব সার্ভার থেকে এই ত্রুটিটি এসেছে: আপনার পোস্টের মানটি এনকোডিং করার চেষ্টা করুন। আমি "কার্ল" এর মাধ্যমে পোস্টিং করছিলাম এবং আবিষ্কার করেছি যে আমি আমার বেস 64৪ মানটি url- এনকোড করছি না তাই "+" এর মতো অক্ষরগুলি এড়ানো যায় নি তাই ওয়েব সার্ভার ইউআরএল-ডিকোড যুক্তি স্বয়ংক্রিয়ভাবে ইউআরএল-ডিকোড দৌড়ে এবং + স্পেসে রূপান্তরিত করে।

"+" একটি বৈধ বেস 64 অক্ষর এবং সম্ভবত একমাত্র অক্ষর যা অপ্রত্যাশিত ইউআরএল-ডিকোড দ্বারা ম্যাঙ্গেল হয়ে যায়।


0

আমার ক্ষেত্রে ইমেলের বিশ্লেষণের সময় আমি সেই ত্রুটির মুখোমুখি হয়েছিলাম। আমি বেস base৪ স্ট্রিং হিসাবে সংযুক্তি পেয়েছি এবং এটি পুনরায় অনুসন্ধানের মাধ্যমে বের করে নিই। শেষ পর্যন্ত সেখানে একটি অদ্ভুত অতিরিক্ত সাবস্ট্রিং ছিল।

dHJhaWxlcgo8PCAvU2l6ZSAxNSAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWyhcMDAyXDMz
MHtPcFwyNTZbezU/VzheXDM0MXFcMzExKShcMDAyXDMzMHtPcFwyNTZbezU/VzheXDM0MXFcMzEx
KV0KPj4Kc3RhcnR4cmVmCjY3MDEKJSVFT0YK

--_=ic0008m4wtZ4TqBFd+sXC8--

আমি যখন --_=ic0008m4wtZ4TqBFd+sXC8--স্ট্রিংটি মোছা এবং ফেলা করি তখন পার্সিং ঠিক হয়ে যায়।

সুতরাং আমার পরামর্শটি নিশ্চিত করে নিন যে আপনি একটি সঠিক বেস 64 স্ট্রিংটি ডিকোড করছেন।


0

আপনার ব্যবহার করা উচিত

base64.b64decode(b64_string, ' /')

ডিফল্টরূপে, বেদীগুলি হয় '+/'


1
অজগর 3.7 এ কাজ করে না। দৃsert় লেইন (ওয়েলচার্স) == 2, পুনরায় (ওয়েলচার্স)
ডেটা টিটি

0

আমি পাশাপাশি এই সমস্যার মধ্যে দৌড়েছি এবং কিছুই কাজ করে না। পরিশেষে আমি সমাধানটি খুঁজে পেয়েছি যা আমার পক্ষে কাজ করে। আমি বেস 64 এ কন্টেন্টটি জিপ করেছিলাম এবং এক মিলিয়ন রেকর্ডের মধ্যে 1 টিতে এটি ঘটেছে ...

এটি সাইমন স্যাপিন প্রস্তাবিত সমাধানটির একটি সংস্করণ।

যদি প্যাডিংটি 3 টি হারিয়ে যায় তবে আমি শেষ 3 টি অক্ষর সরিয়ে ফেলি।

"0gA1RD5L / 9AUGtH9MzAwAAA ==" এর পরিবর্তে

আমরা "0gA1RD5L / 9AUGtH9MzAwAA" পাই

        missing_padding = len(data) % 4
        if missing_padding == 3:
            data = data[0:-3]
        elif missing_padding != 0:
            print ("Missing padding : " + str(missing_padding))
            data += '=' * (4 - missing_padding)
        data_decoded = base64.b64decode(data)   

এই উত্তর অনুসারে ট্রেইলিং বেস বেস হিসাবে যেমন শূন্য হয়। তবে কেন এখনও এনকোডারটি এটিকে বিভ্রান্ত করে তা আমার কোনও ধারণা নেই ...

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