pdf_writer.encrypt(user_pwd=None, owner_pwd=None, use_128bit=True)报错TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
时间: 2024-01-28 19:04:57 浏览: 24
这个错误提示是因为在调用pdf_writer.encrypt()方法时,传入的参数user_pwd或owner_pwd是None,而在方法中使用了字符串类型的操作。
解决方法是在调用方法时,确保传入的参数user_pwd和owner_pwd是字符串类型的,例如:
```
pdf_writer.encrypt(user_pwd='', owner_pwd='mypassword', use_128bit=True)
```
或者在方法内部增加类型判断和默认值,例如:
```
def encrypt(self, user_pwd=None, owner_pwd=None, use_128bit=True):
if user_pwd is None:
user_pwd = ''
if owner_pwd is None:
owner_pwd = ''
...
```
这样就可以避免该错误发生。
相关问题
grant execute on dbms_crypto to system; declare input_string VARCHAR2 (200) := 'Secret Message'; output_string VARCHAR2(2000); encrypted_raw RAW(2000); decrypted_raw RAW(2000); num_key_bytes NUMBER := 256/8; key_bytes_raw RAW(32); encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; begin DBMS_OUTPUT.PUT_LINE(input_string); key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes); encrypted_raw := DBMS_CRYPTO.ENCRYPT ( src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw ); decrypted_raw := DBMS_CRYPTO.DECRYPT ( src => encrypted_raw, typ => encryption_type, key => key_bytes_raw ); output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8'); DBMS_OUTPUT.PUT_LINE(output_string); end; declare l_src_data varchar2(20); l_type pls_integer :=DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_encval raw(2000); CURSOR secret_cursor IS select phonenumber from customer; begin OPEN secret_cursor; LOOP FETCH secret_cursor INTO l_src_data; l_encval :=dbms_crypto.encrypt( src=>utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); DBMS_OUTPUT.PUT_LINE (l_encval); EXIT WHEN secret_cursor%NOTFOUND; END LOOP; CLOSE secret_cursor; end; declare ;_src_data row(100) :=hextoraw("190248129038903853275ijdkvjkad'); l_type pls_integer :=dbms_crypto.encrypt_aes128+ + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_decval raw(200); begin l_decval :=dbms_crypto.decrypt( src=>l_src_data, typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); end; SELECT Price FROM PRODUCT WHERE ProductID = 5;修正这一段代码
以下是修正后的代码:
```
grant execute on dbms_crypto to system;
-- 第一个代码块
declare
input_string VARCHAR2 (200) := 'Secret Message';
output_string VARCHAR2(2000);
encrypted_raw RAW(2000);
decrypted_raw RAW(2000);
num_key_bytes NUMBER := 256/8;
key_bytes_raw RAW(32);
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
begin
DBMS_OUTPUT.PUT_LINE(input_string);
key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES(num_key_bytes);
encrypted_raw := DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), typ => encryption_type, key => key_bytes_raw);
decrypted_raw := DBMS_CRYPTO.DECRYPT(src => encrypted_raw, typ => encryption_type, key => key_bytes_raw);
output_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE(output_string);
end;
-- 第二个代码块
declare
l_src_data varchar2(20);
l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
l_key varchar2(20) := '0123456789123456';
l_encval raw(2000);
cursor secret_cursor is select phonenumber from customer;
begin
open secret_cursor;
loop
fetch secret_cursor into l_src_data;
exit when secret_cursor%notfound;
l_encval := dbms_crypto.encrypt(src => utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ => l_type, key => utl_i18n.string_to_raw(l_key,'AL32UTF8'));
dbms_output.put_line(l_encval);
end loop;
close secret_cursor;
end;
-- 第三个代码块
declare
l_src_data raw(100) := hextoraw('190248129038903853275ijdkvjkad');
l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
l_key varchar2(20) := '0123456789123456';
l_decval raw(200);
begin
l_decval := dbms_crypto.decrypt(src => l_src_data, typ => l_type, key => utl_i18n.string_to_raw(l_key,'AL32UTF8'));
end;
-- SQL 查询语句
SELECT Price FROM PRODUCT WHERE ProductID = 5;
```
注意:第三个代码块中的 `l_src_data` 变量的赋值语句中,修正了单引号和双引号的不匹配问题。
declare l_src_data varchar2(20); l_type pls_integer :=DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_encval raw(2000); CURSOR secret_cursor IS select phonenumber from customer; begin OPEN secret_cursor; LOOP FETCH secret_cursor INTO l_src_data; l_encval :=dbms_crypto.encrypt( src=>utl_i18n.string_to_raw(l_src_data,'AL32UTF8'), typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); DBMS_OUTPUT.PUT_LINE (l_encval); EXIT WHEN secret_cursor%NOTFOUND; END LOOP; CLOSE secret_cursor; end; declare ;_src_data row(100) :=hextoraw("190248129038903853275ijdkvjkad'); l_type pls_integer :=dbms_crypto.encrypt_aes128+ + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5; l_key varchar2(20) :='0123456789123456'; l_decval raw(200); begin l_decval :=dbms_crypto.decrypt( src=>l_src_data, typ=>l_type, key=>utl_i18n.string_to_raw(l_key,'AL32UTF8')); end;改错
有几个错误需要改正:
1. 在第一个代码块中,`raw(2000)` 应该改为 `raw(200)`,因为加密后的数据不会超过 200 个字节。
2. 在第二个代码块中,`row(100)` 应该改为 `raw(100)`,因为需要将十六进制字符串转换为原始二进制数据。
3. 在第一个代码块和第二个代码块中,加密类型 `DBMS_CRYPTO.ENCRYPT_AES128` 应该改为 `DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5`,以保证使用 AES128 算法、CBC 模式和 PKCS5 填充。
4. 在第二个代码块中,`l_src_data` 应该改为 `_src_data`,因为变量名不一致。
修改后的代码如下:
```
declare
l_src_data varchar2(20);
l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
l_key varchar2(20) := '0123456789123456';
l_encval raw(200);
CURSOR secret_cursor IS
select phonenumber from customer;
begin
OPEN secret_cursor;
LOOP
FETCH secret_cursor INTO l_src_data;
EXIT WHEN secret_cursor%NOTFOUND;
l_encval := dbms_crypto.encrypt(
src => utl_i18n.string_to_raw(l_src_data, 'AL32UTF8'),
typ => l_type,
key => utl_i18n.string_to_raw(l_key, 'AL32UTF8')
);
DBMS_OUTPUT.PUT_LINE(l_encval);
END LOOP;
CLOSE secret_cursor;
end;
declare
_src_data raw(100) := hextoraw('190248129038903853275ijdkvjkad');
l_type pls_integer := DBMS_CRYPTO.ENCRYPT_AES128
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
l_key varchar2(20) := '0123456789123456';
l_decval raw(200);
begin
l_decval := dbms_crypto.decrypt(
src => _src_data,
typ => l_type,
key => utl_i18n.string_to_raw(l_key, 'AL32UTF8')
);
end;
```