加密和解密中不同类型填充的混合

时间:2015-12-03 13:25:55

标签: cryptography pkcs#7

我经常搜索并无处可寻。我需要知道这一点,我可以使用X类型的填充进行加密并使用Y进行解密吗?

例如,使用ISO 10126加密并使用PKCS#7ANSI X.923进行解密?

或者它只能使用与encryptiondecryption相同的算法?

提前致谢。

1 个答案:

答案 0 :(得分:1)

从理论上讲,你不能,那些与大多数加密算法相同的算法彼此不兼容。

您可以使用不同的算法对某些内容进行两次或更多次加密,但您需要始终使用相同的算法对其进行解密,并使用正确的顺序(反转)。

与填充相同,每个填充可能会生成不同的内容,因此您不能指望其他算法正确地找出原始邮件的内容。举个例子,用ISO加密并用ANSI X.923解密,你会看到结果不同。

让我们接收一条消息和8个字节的块:

package
{
    import com.tavernari.asworker.ASWorker;
    import com.tavernari.asworker.notification.NotificationCenter;
    import com.tavernari.asworker.notification.NotificationCenterEvent;

    import flash.display.Sprite;

    public class ASWorkerDemo extends Sprite
    {
        private var asWorker:ASWorker;

        //BOTH AREA

        public function ASWorkerDemo()
        {
            //important know, all class start here will be replicated in all works.
            asWorker = new ASWorker(this.stage, uiWorkerStartedHandler, backWorkerStartedHandler);  
        }

        //BOTH AREA END

        //UI AREA START
        private function uiWorkerStartedHandler():void{
            //implement all class or calls for your UI

            NotificationCenter.addEventListener("FROM_BACK_EVENT_MESSAGE", onFromBackEventMessageHandler );

        }

        private function onFromBackEventMessageHandler(e:NotificationCenterEvent):void
        {
            trace(e.data);

            if(e.data == "completed job"){
                NotificationCenter.dispatchEventBetweenWorkers( new NotificationCenterEvent("NEXT_MESSAGE") );
            }
        }

        //UI AREA END

        //BACK AREA START

        private function backWorkerStartedHandler():void{
            //implement all class or calls for your BACK operations 
            NotificationCenter.addEventListener("NEXT_MESSAGE", uiCallForNextMessageHandler );
        }

        private function uiCallForNextMessageHandler():void
        {
            for(var i:int = 0; i < 15; ++i){
                NotificationCenter.dispatchEventBetweenWorkers( new NotificationCenterEvent("FROM_BACK_EVENT_MESSAGE", false, i) );
            }

            NotificationCenter.dispatchEventBetweenWorkers( new NotificationCenterEvent("FROM_BACK_EVENT_MESSAGE", false, "completed job") );
        }

        // BACK AREA END
    }
}

ANSI X.923填充:

... | DD DD DD DD DD DD DD DD | DD DD DD DD 

ISO 10126填充:

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |

如果您首先使用ISO,那么ANSI预计会增加3个字节为 00 &#39;,而它们不是(ISO添加随机的)。现在即使有&#39; 04 &#39;建议可以添加4个字节,但显然不匹配。因此,它会假设没有添加任何内容并声明填充消息为原始消息。

注意:如果以某种方式数据的性质让你决定什么是填充,什么不是,那么你可以使用你想要的任何东西。只需在解密后删除填充

UPATE: 正如 Artjom B。已经注意到,ISO 10126的解密将与例如兼容。 ANSI X.923和PKCS#7,因为它假定随机字节填充,并且最后一个字节的方法是相同的。

此外,算法没有必要精确地遵循规范,在这种情况下,它们可能会从完整格式验证中退出,从而变得更加兼容。