вторник, 12 апреля 2011 г.

Противная ошибка в Crypt::DES

Проблема: При использовании модуля Net::SSH::Perl при попытке выполнения некоторых команд в $ssh->cmd() можно получить следующюю ошибку:

input must be 8 bytes long at /usr/local/lib/perl/5.10.1/Crypt/DES.pm line 57.

Причина: модуль Net::SSH::Perl реализован на чистом Perl и все методы шифрования пользует свои, в том числе и Crypt::DES. А последний плохо дружит в UTF-8, поэтому и отгребает ошибку.

Фикс: добавить 'utf8::downgrade($data);' в проблемный DES.pm прямо перед строкой, на которую ссылается ошибка. Например, в мое случае я заменил

my ($self,$data) = @_;
return Crypt::DES::crypt($data, $data, $self->{'ks'}, 1);


на

my ($self,$data) = @_;
utf8::downgrade($data);
return Crypt::DES::crypt($data, $data, $self->{'ks'}, 1);


Решение нашел на perlmonks.org.

P.S. Та же беда с Cryprt::Blowfish. Фиксится так же.

P.P.S. Можно еще попробовать чиперы другие использовать. Я не пробовал.

Комментариев нет:

Отправить комментарий