0

最初にjavax.crypto.spec.SecretKeySpecでキー「rubicon」を使用して「06.93308」を暗号化し、openSSLを使用してC++で別のキーを暗号化します。ただし、どちらも異なる暗号化値を提供しています。Javaバージョンでは16進数が表示さA834BDD6C3478B8Cれますが、OpenSSLでは16進数が表示されますが、D06D7CB756744903これはかなり異なります。目的は、同等のJavaと同じ結果を取得することです。私が間違っていることについてのアイデアはありますか?

Javaコードは次のとおりです。

char[] password = new char[] { 'r', 'u', 'b', 'i', 'c', 'o', 'n' };
byte[] raw = encrypt(password,"06.93308" );

    private static byte[] encrypt(char[] password, String plaintext) throws Exception {
            byte[] bytes = new byte[password.length];
            for (int i = 0; i < password.length; ++i) {
                    bytes[i] = (byte) password[i];
            }
            SecretKeySpec skeySpec = new SecretKeySpec(bytes, "Blowfish");
            Cipher cipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(plaintext.getBytes());
            return encrypted;
    }

C++側は次のとおりです。

   CBlowFish oBlowFish((byte *)"rubicon", 8);

   char encryptedPrice[17] = "\0\0\0\0\0\0\0\0";
   char myBidPrice[] = "06.93308";
   encrypt(myBidPrice,encryptedPrice);


    void encrypt(char bidPrice[],char encryptedPrice[])
    {
        oBlowFish.Encrypt((unsigned char*)bidPrice, (unsigned char*)encryptedPrice,8 );
    }

これは、上記のC++コードと同じ結果をもたらすopenSSLコードです。

#define SIZE 16

unsigned char *out = (unsigned char *)calloc(SIZE+1, sizeof(char));
BF_KEY *key = (BF_KEY *)calloc(1, sizeof(BF_KEY));
BF_set_key(key, SIZE, (const unsigned char*)"rubicon" );
BF_ecb_encrypt(in, out, key, BF_ENCRYPT);
printf("%s\n",out);
4

1 に答える 1

1

「rubicon」の長さは16バイトではありません。それに応じて調整する必要がありますSIZE

于 2012-08-31T11:31:45.633 に答える