Какое пространство имен является глобальными функциями python в [duplicate]

Предполагая, что вы будете исправлять такие вещи, как пустой IV & amp; что это доказательство концепции, ваш код выходит из строя, потому что:

  1. Вы не используете прописку на Java, вам нужно использовать то же самое в JS
  2. . Вы вручную набираете нули в Java, вам нужно сделать то же самое в JS
  3. . Вы base64 декодируете ключ, но не его base64 (его шестнадцатеричная строка байтов)
  4. Java IV представляет собой массив нулей но в JS вы используете пробелы (и ошибочно относитесь к нему как base64).

Чтобы дублировать вывод в JS:

CryptoJS.pad.NoPadding = {pad: function(){}, unpad: function(){}};

var text = "My Secret text\0\0";
var key = CryptoJS.enc.Hex.parse("253D3FB468A0E24677C28A624BE0F939");
var iv  = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");

var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv, padding: CryptoJS.pad.NoPadding});
console.log(encrypted.toString());

Для:

< blockquote>

7StScX3LnPUly / VNzBes0w ==

6
задан Jason Webb 4 January 2011 в 23:13
поделиться

2 ответа

Используйте builtins или __builtin__ , если вы находитесь на Python 2.

def open():
    pass

import __builtin__

print open
print __builtin__.open

Это дает вам:

<function open at 0x011E8670>
<built-in function open>
14
ответ дан user2357112 21 August 2018 в 08:16
поделиться
  • 1
    Если вы набираете все эти символы подчеркивания, вы также можете сделать import __builtin__ as builtin или тому подобное. – kindall 5 January 2011 в 00:10
  • 2
    что за жизнь :-) – Yeo 29 August 2012 в 05:39

Python имеет модуль builtins , где хранятся «действительно глобальные» вещи - обычно только стандартные встроенные функции и типы . В Python 2 он был назван __builtin__, но работал в основном тем же самым.

Этот модуль можно импортировать так же, как и любой другой модуль, но он также волшебным образом снабжает встроенные имена для каждого другого модуля (что doesn 't скрыть их.


Если вам интересно, как это работает, builtins docs говорят:

В качестве детали реализации большинство модулей имеют имя __builtins__ доступно как часть их глобалов. Значение __builtins__ обычно является либо этим модулем, либо значением атрибута __dict__ этого модуля. Поскольку это детализация реализации, она не может использоваться альтернативными реализациями Python.

И exec говорит:

Если словарь globals не содержит значения для ключа __builtins__, под этим ключом вставлена ​​ссылка на словарь встроенного модуля builtins. Таким образом, вы можете контролировать, какие встроенные функции доступны для исполняемого кода, вставив ваш собственный словарь __builtins__ в глобалы, прежде чем передавать его на exec().

Итак, по крайней мере, в CPython, когда вы оцениваете abs, он просматривается в globals()['abs'], не найден там, а затем просматривается в globals()['__builtins__'].__dict__['abs'].

И всякий раз, когда Python (или, по крайней мере, CPython) создает новый объект модуля, его код выполняется с globals с empty __builtins__, что означает, что значение модуля по умолчанию builtins заполняется, так что это работает. И этот globals - тот, который копируется для очень функции и класса, определенных в модуле (и все, что вы делаете явно с globals без явной замены __builtins__), поэтому оно работает внутри функций и классов.

0
ответ дан abarnert 21 August 2018 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: