Mine may be fast but it makes some assumptions about the data. It assumes each value in @k is a byte value (between 0 and 255) and that $a, $b, and $c start out at 0. If the first is true but the second isn't, it might still work if the results of the unpack are stored in different variables and added to $a, $b, and $c. But I think BrowserUK said that this is part of some sort of encryption routine so it's quite possible the first assumption is wrong and thus the whole thing falls apart.
---
print map { my ($m)=1<<hex($_)&11?' ':'';
$m.=substr('AHJPacehklnorstu',hex($_),1) }
split //,'2fde0abe76c36c914586c';