Android 使用OpenSSL进行3DES加密 c与java互通

14 篇文章 0 订阅
1 篇文章 0 订阅

首先看下我们的文件结构:

这里写图片描述

OpenSSL文件

com_csii_desjni_DESJniUtil.c

#include <com_csii_desjni_DESJniUtil.h>
#include <android/log.h>
#include <string.h>
#include <jni.h>
#include <unistd.h>
#include "include/openssl/des.h"
#include "include/openssl/bio.h"
#include "include/openssl/evp.h"
#include "include/openssl/buffer.h"

static void openssl_base64_decode(char *encoded_bytes,
        unsigned char **decoded_bytes, size_t *decoded_length) {
    BIO *bioMem, *b64;
    size_t buffer_length;

    bioMem = BIO_new_mem_buf((void *) encoded_bytes, -1);
    b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bioMem = BIO_push(b64, bioMem);

    buffer_length = BIO_get_mem_data(bioMem, NULL);
    *decoded_bytes = malloc(buffer_length);
    if (decoded_bytes == NULL) {
        BIO_free_all(bioMem);
        *decoded_length = 0;
        return;
    }
    *decoded_length = BIO_read(bioMem, *decoded_bytes, buffer_length);
    BIO_free_all(bioMem);
}
/* Return NULL if failed, REMEMBER to free() */
static char *openssl_base64_encode(unsigned char *decoded_bytes,
        size_t decoded_length) {
    int x;
    BIO *bioMem, *b64;
    BUF_MEM *bufPtr;
    char *buff = NULL;

    b64 = BIO_new(BIO_f_base64());
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    bioMem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bioMem);

    BIO_write(b64, decoded_bytes, decoded_length);
    x = BIO_flush(b64);
    if (x < 1)
        goto END;

    BIO_get_mem_ptr(b64, &bufPtr);

    buff = (char *) malloc(bufPtr->length + 1);
    if (buff == NULL)
        goto END;
    memcpy(buff, bufPtr->data, bufPtr->length);
    buff[bufPtr->length] = 0;

    END: BIO_free_all(b64);
    return buff;
}

unsigned char * encryptDES(const char *data, int * lenreturn);
unsigned char * decryptDES(const char *data, int data_len);
JNIEXPORT jstring JNICALL Java_com_csii_desjni_DESJniUtil_encryptDES(
        JNIEnv *env, jobject obj, jstring inputStr) {
    const char *str = (*env)->GetStringUTFChars(env, inputStr, JNI_FALSE);
    unsigned char *dst;
    int lenreturn;
    dst = encryptDES(str, &lenreturn);
//  char KEY[9] = { 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'k', '\0' };
//  getKey(KEY);
    return (*env)->NewStringUTF(env, openssl_base64_encode(dst, lenreturn));
}
JNIEXPORT jstring JNICALL Java_com_csii_desjni_DESJniUtil_decryptDES(
        JNIEnv *env, jobject obj, jstring inputStr) {
    const char *str = (*env)->GetStringUTFChars(env, inputStr, JNI_FALSE);
    char *str2;
    int len;
    openssl_base64_decode(str, &str2, &len);
    __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "str2=%s len=%d strlen=%d",
            str2, len, strlen(str2));
    unsigned char *dst;
    dst = decryptDES(str2, len);
    __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "dst=%s", dst);
    return (*env)->NewStringUTF(env, dst);
}



unsigned char * encryptDES(const char *data, int * lenreturn) {
    int docontinue = 1;
//  char *data = "gubojun"; /* 明文 */
    int data_len;
    int data_rest;
    unsigned char ch;
    unsigned char *src = NULL; /* 补齐后的明文 */
    unsigned char *dst = NULL; /* 解密后的明文 */
    int len;
    unsigned char tmp[8];
    unsigned char in[8];
    unsigned char out[8];
    char *k = "12345678"; /* 原始密钥 */
    int key_len;
#define LEN_OF_KEY 24
    unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */
    unsigned char block_key[9];
    DES_key_schedule ks, ks2, ks3;
    /* 构造补齐后的密钥 */
    key_len = strlen(k);
    memcpy(key, k, key_len);
    memset(key + key_len, 0x00, LEN_OF_KEY - key_len);
    /* 分析补齐明文所需空间及补齐填充数据 */
    data_len = strlen(data);
    data_rest = data_len % 8;
    len = data_len + (8 - data_rest);
    ch = 8 - data_rest;
    src = (unsigned char *) malloc(len);
    dst = (unsigned char *) malloc(len);
    if (NULL == src || NULL == dst) {
        docontinue = 0;
    }
    if (docontinue) {
        int count;
        int i;
        /* 构造补齐后的加密内容 */
        memset(src, 0, len);
        memcpy(src, data, data_len);
        memset(src + data_len, ch, 8 - data_rest);
        /* 密钥置换 */
        memset(block_key, 0, sizeof(block_key));
        memcpy(block_key, key + 0, 8);
        DES_set_key_unchecked((const_DES_cblock*) block_key, &ks);
        memcpy(block_key, key + 8, 8);
        DES_set_key_unchecked((const_DES_cblock*) block_key, &ks2);
        memcpy(block_key, key + 16, 8);
        DES_set_key_unchecked((const_DES_cblock*) block_key, &ks3);

        /* 循环加密/解密,每8字节一次 */
        count = len / 8;
        for (i = 0; i < count; i++) {
            memset(tmp, 0, 8);
            memset(in, 0, 8);
            memset(out, 0, 8);
            memcpy(tmp, src + 8 * i, 8);
            /* 加密 */
            DES_ecb3_encrypt((const_DES_cblock*) tmp, (DES_cblock*) in, &ks,
                    &ks2, &ks3, DES_ENCRYPT);
            /* 解密 */
            //          DES_ecb3_encrypt((const_DES_cblock*) in, (DES_cblock*) out, &ks,
            //                  &ks2, &ks3, DES_DECRYPT);
            /* 将解密的内容拷贝到解密后的明文 */
            //          memcpy(dst + 8 * i, out, 8);
            memcpy(dst + 8 * i, in, 8);
        }
    }
//  __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "密文 %s", dst);
//  __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "after decrypt:");
//  int i;
//  for (i = 0; i < len; i++) {
//      __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "0x%.2X %c %d",
//              *(dst + i), *(dst + i), *(dst + i));
//  }
    *lenreturn = len;
    if (NULL != src) {
        free(src);
        src = NULL;
    }
    if (NULL != dst) {
        return dst;
    }
    return NULL;
//  if (NULL != dst) {
//      free(dst);
//      dst = NULL;
//  }
}
unsigned char * decryptDES(const char *data, int data_len) {
    int docontinue = 1;
//  char *data = "gubojun"; /* 明文 */
//  int data_len;
    int data_rest;
    unsigned char ch;
    unsigned char *src = NULL; /* 补齐后的明文 */
    unsigned char *dst = NULL; /* 解密后的明文 */
    int len;
    unsigned char tmp[8];
    unsigned char in[8];
    unsigned char out[8];
    char *k = "12345678"; /* 原始密钥 */
    int key_len;
#define LEN_OF_KEY 24
    unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */
    unsigned char block_key[9];
    DES_key_schedule ks, ks2, ks3;
    /* 构造补齐后的密钥 */
    key_len = strlen(k);
    memcpy(key, k, key_len);
    memset(key + key_len, 0x00, LEN_OF_KEY - key_len);
    /* 分析补齐明文所需空间及补齐填充数据 */
//  data_len = strlen(data);
    data_rest = data_len % 8;
    len = data_len; // + (8 - data_rest);
//  ch = 8 - data_rest;
    src = (unsigned char *) malloc(len);
    dst = (unsigned char *) malloc(len);
    if (NULL == src || NULL == dst) {
        docontinue = 0;
    }
    if (docontinue) {
        int count;
        int i;
        /* 构造补齐后的加密内容 */
        memset(src, 0, len);
        memcpy(src, data, data_len);
//      memset(src + data_len, ch, 8 - data_rest);
        /* 密钥置换 */
        memset(block_key, 0, sizeof(block_key));
        memcpy(block_key, key + 0, 8);
        DES_set_key_unchecked((const_DES_cblock*) block_key, &ks);
        memcpy(block_key, key + 8, 8);
        DES_set_key_unchecked((const_DES_cblock*) block_key, &ks2);
        memcpy(block_key, key + 16, 8);
        DES_set_key_unchecked((const_DES_cblock*) block_key, &ks3);

        /* 循环加密/解密,每8字节一次 */
        count = len / 8;
        for (i = 0; i < count; i++) {
            memset(tmp, 0, 8);
//          memset(in, 0, 8);
            memset(out, 0, 8);
//          if (i == count) {
//              memcpy(tmp, src + 8 * i, len - 8 * i);
//          } else
            memcpy(tmp, src + 8 * i, 8);
            /* 加密 */
//          DES_ecb3_encrypt((const_DES_cblock*) tmp, (DES_cblock*) in, &ks,
//                  &ks2, &ks3, DES_ENCRYPT);
            /* 解密 */
            DES_ecb3_encrypt((const_DES_cblock*) tmp, (DES_cblock*) out, &ks,
                    &ks2, &ks3, DES_DECRYPT);
            /* 将解密的内容拷贝到解密后的明文 */
            memcpy(dst + 8 * i, out, 8);
//          memcpy(dst + 8 * i, in, 8);
        }
        for (i = 0; i < len; i++) {
            if (*(dst + i) < 9) {
                *(dst + i) = 0;
                break;
            }
        }
    }
//  __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "密文 %s", dst);
//  __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "after decrypt:");
//  int i;
//  for (i = 0; i < len; i++) {
//      __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "0x%.2X %c %d",
//              *(dst + i), *(dst + i), *(dst + i));
//  }
    if (NULL != src) {
        free(src);
        src = NULL;
    }
    if (NULL != dst) {
        return dst;
    }
    return NULL;
//  if (NULL != dst) {
//      free(dst);
//      dst = NULL;
//  }
}

com_csii_desjni_DESJniUtil.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>

//---------------des---------------
//write by gubojun at 2016-04-14
#include "stdafx.h"
#include "memory.h"
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
//---------------des---------------

#define PLAIN_FILE_OPEN_ERROR -1
#define KEY_FILE_OPEN_ERROR -2
#define CIPHER_FILE_OPEN_ERROR -3
#define OK 1

/* Header for class com_csii_desjni_DESJniUtil */

#ifndef _Included_com_csii_desjni_DESJniUtil
#define _Included_com_csii_desjni_DESJniUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_csii_desjni_DESJniUtil
 * Method:    encryptDES
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_csii_desjni_DESJniUtil_encryptDES(JNIEnv *,
        jclass, jstring);

/*
 * Class:     com_csii_desjni_DESJniUtil
 * Method:    decryptDES
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_csii_desjni_DESJniUtil_decryptDES(JNIEnv *,
        jclass, jstring);

/*
 * Class:     com_csii_desjni_DESJniUtil
 * Method:    getKey
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_csii_desjni_DESJniUtil_getKey(JNIEnv *,
        jclass);
#ifdef __cplusplus
}
#endif
#endif

Base64.java

package com.csii.desjni;

import java.io.ByteArrayOutputStream;

public class Base64
{
    private static char[] base64EncodeChars = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
        'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
        'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };

    private static byte[] base64DecodeChars = new byte[] {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
        -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
        -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 };

    private Base64()
    {
    }

    public static String encode(byte[] data)
    {
        if (data == null)
        {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        int len = data.length;
        int i = 0;
        int b1, b2, b3;

        while (i < len)
        {
            b1 = data[i++] & 0xff;
            if (i == len)
            {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
                sb.append("==");
                break;
            }
            b2 = data[i++] & 0xff;
            if (i == len)
            {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
                sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
                sb.append("=");
                break;
            }
            b3 = data[i++] & 0xff;
            sb.append(base64EncodeChars[b1 >>> 2]);
            sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
            sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
            sb.append(base64EncodeChars[b3 & 0x3f]);
        }
        return sb.toString();
    }

    public static byte[] decode(String str)
    {
        byte[] data = str.getBytes();
        int len = data.length;
        ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
        int i = 0;
        int b1, b2, b3, b4;

        while (i < len)
        {

            /* b1 */
            do
            {
                b1 = base64DecodeChars[data[i++]];
            }
            while (i < len && b1 == -1);
            if (b1 == -1)
            {
                break;
            }

            /* b2 */
            do
            {
                b2 = base64DecodeChars[data[i++]];
            }
            while (i < len && b2 == -1);
            if (b2 == -1)
            {
                break;
            }
            buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));

            /* b3 */
            do
            {
                b3 = data[i++];
                if (b3 == 61)
                {
                    return buf.toByteArray();
                }
                b3 = base64DecodeChars[b3];
            }
            while (i < len && b3 == -1);
            if (b3 == -1)
            {
                break;
            }
            buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));

            /* b4 */
            do
            {
                b4 = data[i++];
                if (b4 == 61)
                {
                    return buf.toByteArray();
                }
                b4 = base64DecodeChars[b4];
            }
            while (i < len && b4 == -1);
            if (b4 == -1)
            {
                break;
            }
            buf.write((int) (((b3 & 0x03) << 6) | b4));
        }
        return buf.toByteArray();
    }
}

DESJniUtil.java

/**
 * DESJniUtil.java
 * <p>
 * Created on 2016年4月14日
 * Modification history
 * <p>
 * @author 顾博君 Internet Banking System Group,CSII
 * @version 1.0
 * @since 1.0
 */
package com.csii.desjni;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * @description
 *
 * @version 1.0
 * @CopyRight © 2015 Client Server Internationtal, Inc(CSII). All Rights reserved.
 * @Author 顾博君 2016年4月14日 下午3:24:51
 * @see
 */
public class DESJniUtil
{
    static
    {
        // 加载库文件
        System.loadLibrary("DESJni");
    }

    // 加密
    public native static String encryptDES(String source);

    // 解密
    public native static String decryptDES(String source);

    // 获取密钥
    // public native static String getKey();

    private static final String CHARSET = "UTF-8";
    private static final String DES = "DES";
    private static SecretKey secretkey = null;

    private static Key getKey(String KEY) throws UnsupportedEncodingException
    {
        if (secretkey == null)
        {
            byte[] bb = null;
            bb = KEY.getBytes(CHARSET);
            secretkey = new SecretKeySpec(bb, DES);
        }
        return secretkey;
    }

    /**
     * 加密
     * 
     * @throws InvalidKeyException
     * @throws UnsupportedEncodingException
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    public static String encryptDES(String source, String KEY) throws Exception
    {
        String s = null;
        byte[] target = null;
        byte[] center = source.getBytes(CHARSET);
        Key key = getKey(KEY);
        Cipher cipher = Cipher.getInstance(DES);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        target = cipher.doFinal(center);
        s = Base64.encode(target);
        return s;
    }

    /**
     * 解密
     */
    public static String decryptDES(String source, String KEY) throws Exception
    {
        String s = null;
        byte[] dissect = null;
        byte[] center = Base64.decode(source);
        Key key = getKey(KEY);
        Cipher cipher = Cipher.getInstance(DES);// 等价于getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key);
        dissect = cipher.doFinal(center);
        s = new String(dissect, CHARSET);
        return s;
    }
}

MainActivity.java

package com.csii.desjni;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView tv = (TextView) findViewById(R.id.tv);
        final EditText et = (EditText) findViewById(R.id.et);
        Button bt = (Button) findViewById(R.id.bt);
        Button bt_en = (Button) findViewById(R.id.bt_en);
        bt.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try
                {
                    tv.append(
                        "\n解密:" + DESJniUtil.decryptDES(DESJniUtil.encryptDES(et.getText().toString())));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
        bt_en.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try
                {
                    String stren = new String(DESJniUtil.encryptDES(et.getText().toString()));
                    tv.append("\n加密:" + stren);
                    Log.v("加密 c:", stren);
                    stren = new String(DESJniUtil.encryptDES(et.getText().toString(), "CSIIQZBk"));
                    Log.v("加密 java:", stren);
                    //
                    // byte[] b = Base64.decode(stren);
                    // for (int i = 0; i < b.length; i++)
                    // {
                    // Log.v("byte:" + i, "" + (b[i] < 0 ? 256 + b[i] : b[i]));
                    // }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
        // Log.v("java Base64:", Base64.encode("gubojun".getBytes()));
        String text = "guboqerqerqer";
        // String text = "gubojun";
        String encrypt = null;

        encrypt = DESJniUtil.encryptDES(text);
        Log.v("加密:", encrypt);
        Log.v("加密2:", new String(Base64.decode(encrypt)));

        tv.append("\n加密:" + encrypt);
        // Log.v("解密:", DESJniUtil.decryptDES(encrypt));
        try
        {
            tv.append("\n解密:" + DESJniUtil.decryptDES(encrypt));
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    static
    {
        // 加载库文件
        System.loadLibrary("DESJni");
    }
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.csii.desjni.MainActivity" >

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解密" />

    <Button
        android:id="@+id/bt_en"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="加密" />

</LinearLayout>

Android.mk

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

CRYPTO_PATH := crypto
SSL_PATH := ssl

local_c_includes := \
    $(LOCAL_PATH)/include \
    $(LOCAL_PATH)/include/openssl \
    $(CRYPTO_PATH) \
    $(CRYPTO_PATH)/asn1 \
    $(CRYPTO_PATH)/evp \
    $(SSL_PATH) \



arm_cflags := -DOPENSSL_BN_ASM_MONT -DAES_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM
arm_src_files := \
    $(CRYPTO_PATH)/aes/asm/aes-armv4.S \
    $(CRYPTO_PATH)/bn/asm/armv4-mont.S \
    $(CRYPTO_PATH)/sha/asm/sha1-armv4-large.S \
    $(CRYPTO_PATH)/sha/asm/sha256-armv4.S \
    $(CRYPTO_PATH)/sha/asm/sha512-armv4.S
non_arm_src_files := $(CRYPTO_PATH)/aes/aes_core.c

local_crypto_src := \
    $(CRYPTO_PATH)/cryptlib.c \
    $(CRYPTO_PATH)/mem.c \
    $(CRYPTO_PATH)/mem_clr.c \
    $(CRYPTO_PATH)/mem_dbg.c \
    $(CRYPTO_PATH)/cversion.c \
    $(CRYPTO_PATH)/ex_data.c \
    $(CRYPTO_PATH)/cpt_err.c \
    $(CRYPTO_PATH)/ebcdic.c \
    $(CRYPTO_PATH)/uid.c \
    $(CRYPTO_PATH)/o_time.c \
    $(CRYPTO_PATH)/o_str.c \
    $(CRYPTO_PATH)/o_dir.c \
    $(CRYPTO_PATH)/aes/aes_cbc.c \
    $(CRYPTO_PATH)/aes/aes_cfb.c \
    $(CRYPTO_PATH)/aes/aes_ctr.c \
    $(CRYPTO_PATH)/aes/aes_ecb.c \
    $(CRYPTO_PATH)/aes/aes_misc.c \
    $(CRYPTO_PATH)/aes/aes_ofb.c \
    $(CRYPTO_PATH)/aes/aes_wrap.c \
    $(CRYPTO_PATH)/asn1/a_bitstr.c \
    $(CRYPTO_PATH)/asn1/a_bool.c \
    $(CRYPTO_PATH)/asn1/a_bytes.c \
    $(CRYPTO_PATH)/asn1/a_d2i_fp.c \
    $(CRYPTO_PATH)/asn1/a_digest.c \
    $(CRYPTO_PATH)/asn1/a_dup.c \
    $(CRYPTO_PATH)/asn1/a_enum.c \
    $(CRYPTO_PATH)/asn1/a_gentm.c \
    $(CRYPTO_PATH)/asn1/a_i2d_fp.c \
    $(CRYPTO_PATH)/asn1/a_int.c \
    $(CRYPTO_PATH)/asn1/a_mbstr.c \
    $(CRYPTO_PATH)/asn1/a_object.c \
    $(CRYPTO_PATH)/asn1/a_octet.c \
    $(CRYPTO_PATH)/asn1/a_print.c \
    $(CRYPTO_PATH)/asn1/a_set.c \
    $(CRYPTO_PATH)/asn1/a_sign.c \
    $(CRYPTO_PATH)/asn1/a_strex.c \
    $(CRYPTO_PATH)/asn1/a_strnid.c \
    $(CRYPTO_PATH)/asn1/a_time.c \
    $(CRYPTO_PATH)/asn1/a_type.c \
    $(CRYPTO_PATH)/asn1/a_utctm.c \
    $(CRYPTO_PATH)/asn1/a_utf8.c \
    $(CRYPTO_PATH)/asn1/a_verify.c \
    $(CRYPTO_PATH)/asn1/ameth_lib.c \
    $(CRYPTO_PATH)/asn1/asn1_err.c \
    $(CRYPTO_PATH)/asn1/asn1_gen.c \
    $(CRYPTO_PATH)/asn1/asn1_lib.c \
    $(CRYPTO_PATH)/asn1/asn1_par.c \
    $(CRYPTO_PATH)/asn1/asn_mime.c \
    $(CRYPTO_PATH)/asn1/asn_moid.c \
    $(CRYPTO_PATH)/asn1/asn_pack.c \
    $(CRYPTO_PATH)/asn1/bio_asn1.c \
    $(CRYPTO_PATH)/asn1/bio_ndef.c \
    $(CRYPTO_PATH)/asn1/d2i_pr.c \
    $(CRYPTO_PATH)/asn1/d2i_pu.c \
    $(CRYPTO_PATH)/asn1/evp_asn1.c \
    $(CRYPTO_PATH)/asn1/f_enum.c \
    $(CRYPTO_PATH)/asn1/f_int.c \
    $(CRYPTO_PATH)/asn1/f_string.c \
    $(CRYPTO_PATH)/asn1/i2d_pr.c \
    $(CRYPTO_PATH)/asn1/i2d_pu.c \
    $(CRYPTO_PATH)/asn1/n_pkey.c \
    $(CRYPTO_PATH)/asn1/nsseq.c \
    $(CRYPTO_PATH)/asn1/p5_pbe.c \
    $(CRYPTO_PATH)/asn1/p5_pbev2.c \
    $(CRYPTO_PATH)/asn1/p8_pkey.c \
    $(CRYPTO_PATH)/asn1/t_bitst.c \
    $(CRYPTO_PATH)/asn1/t_crl.c \
    $(CRYPTO_PATH)/asn1/t_pkey.c \
    $(CRYPTO_PATH)/asn1/t_req.c \
    $(CRYPTO_PATH)/asn1/t_spki.c \
    $(CRYPTO_PATH)/asn1/t_x509.c \
    $(CRYPTO_PATH)/asn1/t_x509a.c \
    $(CRYPTO_PATH)/asn1/tasn_dec.c \
    $(CRYPTO_PATH)/asn1/tasn_enc.c \
    $(CRYPTO_PATH)/asn1/tasn_fre.c \
    $(CRYPTO_PATH)/asn1/tasn_new.c \
    $(CRYPTO_PATH)/asn1/tasn_prn.c \
    $(CRYPTO_PATH)/asn1/tasn_typ.c \
    $(CRYPTO_PATH)/asn1/tasn_utl.c \
    $(CRYPTO_PATH)/asn1/x_algor.c \
    $(CRYPTO_PATH)/asn1/x_attrib.c \
    $(CRYPTO_PATH)/asn1/x_bignum.c \
    $(CRYPTO_PATH)/asn1/x_crl.c \
    $(CRYPTO_PATH)/asn1/x_exten.c \
    $(CRYPTO_PATH)/asn1/x_info.c \
    $(CRYPTO_PATH)/asn1/x_long.c \
    $(CRYPTO_PATH)/asn1/x_name.c \
    $(CRYPTO_PATH)/asn1/x_nx509.c \
    $(CRYPTO_PATH)/asn1/x_pkey.c \
    $(CRYPTO_PATH)/asn1/x_pubkey.c \
    $(CRYPTO_PATH)/asn1/x_req.c \
    $(CRYPTO_PATH)/asn1/x_sig.c \
    $(CRYPTO_PATH)/asn1/x_spki.c \
    $(CRYPTO_PATH)/asn1/x_val.c \
    $(CRYPTO_PATH)/asn1/x_x509.c \
    $(CRYPTO_PATH)/asn1/x_x509a.c \
    $(CRYPTO_PATH)/bf/bf_cfb64.c \
    $(CRYPTO_PATH)/bf/bf_ecb.c \
    $(CRYPTO_PATH)/bf/bf_enc.c \
    $(CRYPTO_PATH)/bf/bf_ofb64.c \
    $(CRYPTO_PATH)/bf/bf_skey.c \
    $(CRYPTO_PATH)/bio/b_dump.c \
    $(CRYPTO_PATH)/bio/b_print.c \
    $(CRYPTO_PATH)/bio/b_sock.c \
    $(CRYPTO_PATH)/bio/bf_buff.c \
    $(CRYPTO_PATH)/bio/bf_nbio.c \
    $(CRYPTO_PATH)/bio/bf_null.c \
    $(CRYPTO_PATH)/bio/bio_cb.c \
    $(CRYPTO_PATH)/bio/bio_err.c \
    $(CRYPTO_PATH)/bio/bio_lib.c \
    $(CRYPTO_PATH)/bio/bss_acpt.c \
    $(CRYPTO_PATH)/bio/bss_bio.c \
    $(CRYPTO_PATH)/bio/bss_conn.c \
    $(CRYPTO_PATH)/bio/bss_dgram.c \
    $(CRYPTO_PATH)/bio/bss_fd.c \
    $(CRYPTO_PATH)/bio/bss_file.c \
    $(CRYPTO_PATH)/bio/bss_log.c \
    $(CRYPTO_PATH)/bio/bss_mem.c \
    $(CRYPTO_PATH)/bio/bss_null.c \
    $(CRYPTO_PATH)/bio/bss_sock.c \
    $(CRYPTO_PATH)/bn/bn_add.c \
    $(CRYPTO_PATH)/bn/bn_asm.c \
    $(CRYPTO_PATH)/bn/bn_blind.c \
    $(CRYPTO_PATH)/bn/bn_ctx.c \
    $(CRYPTO_PATH)/bn/bn_div.c \
    $(CRYPTO_PATH)/bn/bn_err.c \
    $(CRYPTO_PATH)/bn/bn_exp.c \
    $(CRYPTO_PATH)/bn/bn_exp2.c \
    $(CRYPTO_PATH)/bn/bn_gcd.c \
    $(CRYPTO_PATH)/bn/bn_gf2m.c \
    $(CRYPTO_PATH)/bn/bn_kron.c \
    $(CRYPTO_PATH)/bn/bn_lib.c \
    $(CRYPTO_PATH)/bn/bn_mod.c \
    $(CRYPTO_PATH)/bn/bn_mont.c \
    $(CRYPTO_PATH)/bn/bn_mpi.c \
    $(CRYPTO_PATH)/bn/bn_mul.c \
    $(CRYPTO_PATH)/bn/bn_nist.c \
    $(CRYPTO_PATH)/bn/bn_prime.c \
    $(CRYPTO_PATH)/bn/bn_print.c \
    $(CRYPTO_PATH)/bn/bn_rand.c \
    $(CRYPTO_PATH)/bn/bn_recp.c \
    $(CRYPTO_PATH)/bn/bn_shift.c \
    $(CRYPTO_PATH)/bn/bn_sqr.c \
    $(CRYPTO_PATH)/bn/bn_sqrt.c \
    $(CRYPTO_PATH)/bn/bn_word.c \
    $(CRYPTO_PATH)/buffer/buf_err.c \
    $(CRYPTO_PATH)/buffer/buffer.c \
    $(CRYPTO_PATH)/comp/c_rle.c \
    $(CRYPTO_PATH)/comp/c_zlib.c \
    $(CRYPTO_PATH)/comp/comp_err.c \
    $(CRYPTO_PATH)/comp/comp_lib.c \
    $(CRYPTO_PATH)/conf/conf_api.c \
    $(CRYPTO_PATH)/conf/conf_def.c \
    $(CRYPTO_PATH)/conf/conf_err.c \
    $(CRYPTO_PATH)/conf/conf_lib.c \
    $(CRYPTO_PATH)/conf/conf_mall.c \
    $(CRYPTO_PATH)/conf/conf_mod.c \
    $(CRYPTO_PATH)/conf/conf_sap.c \
    $(CRYPTO_PATH)/des/cbc_cksm.c \
    $(CRYPTO_PATH)/des/cbc_enc.c \
    $(CRYPTO_PATH)/des/cfb64ede.c \
    $(CRYPTO_PATH)/des/cfb64enc.c \
    $(CRYPTO_PATH)/des/cfb_enc.c \
    $(CRYPTO_PATH)/des/des_enc.c \
    $(CRYPTO_PATH)/des/des_old.c \
    $(CRYPTO_PATH)/des/des_old2.c \
    $(CRYPTO_PATH)/des/ecb3_enc.c \
    $(CRYPTO_PATH)/des/ecb_enc.c \
    $(CRYPTO_PATH)/des/ede_cbcm_enc.c \
    $(CRYPTO_PATH)/des/enc_read.c \
    $(CRYPTO_PATH)/des/enc_writ.c \
    $(CRYPTO_PATH)/des/fcrypt.c \
    $(CRYPTO_PATH)/des/fcrypt_b.c \
    $(CRYPTO_PATH)/des/ofb64ede.c \
    $(CRYPTO_PATH)/des/ofb64enc.c \
    $(CRYPTO_PATH)/des/ofb_enc.c \
    $(CRYPTO_PATH)/des/pcbc_enc.c \
    $(CRYPTO_PATH)/des/qud_cksm.c \
    $(CRYPTO_PATH)/des/rand_key.c \
    $(CRYPTO_PATH)/des/read2pwd.c \
    $(CRYPTO_PATH)/des/rpc_enc.c \
    $(CRYPTO_PATH)/des/set_key.c \
    $(CRYPTO_PATH)/des/str2key.c \
    $(CRYPTO_PATH)/des/xcbc_enc.c \
    $(CRYPTO_PATH)/dh/dh_ameth.c \
    $(CRYPTO_PATH)/dh/dh_asn1.c \
    $(CRYPTO_PATH)/dh/dh_check.c \
    $(CRYPTO_PATH)/dh/dh_depr.c \
    $(CRYPTO_PATH)/dh/dh_err.c \
    $(CRYPTO_PATH)/dh/dh_gen.c \
    $(CRYPTO_PATH)/dh/dh_key.c \
    $(CRYPTO_PATH)/dh/dh_lib.c \
    $(CRYPTO_PATH)/dh/dh_pmeth.c \
    $(CRYPTO_PATH)/dsa/dsa_ameth.c \
    $(CRYPTO_PATH)/dsa/dsa_asn1.c \
    $(CRYPTO_PATH)/dsa/dsa_depr.c \
    $(CRYPTO_PATH)/dsa/dsa_err.c \
    $(CRYPTO_PATH)/dsa/dsa_gen.c \
    $(CRYPTO_PATH)/dsa/dsa_key.c \
    $(CRYPTO_PATH)/dsa/dsa_lib.c \
    $(CRYPTO_PATH)/dsa/dsa_ossl.c \
    $(CRYPTO_PATH)/dsa/dsa_pmeth.c \
    $(CRYPTO_PATH)/dsa/dsa_prn.c \
    $(CRYPTO_PATH)/dsa/dsa_sign.c \
    $(CRYPTO_PATH)/dsa/dsa_vrf.c \
    $(CRYPTO_PATH)/dso/dso_dl.c \
    $(CRYPTO_PATH)/dso/dso_dlfcn.c \
    $(CRYPTO_PATH)/dso/dso_err.c \
    $(CRYPTO_PATH)/dso/dso_lib.c \
    $(CRYPTO_PATH)/dso/dso_null.c \
    $(CRYPTO_PATH)/dso/dso_openssl.c \
    $(CRYPTO_PATH)/dso/dso_vms.c \
    $(CRYPTO_PATH)/dso/dso_win32.c \
    $(CRYPTO_PATH)/ec/ec2_mult.c \
    $(CRYPTO_PATH)/ec/ec2_smpl.c \
    $(CRYPTO_PATH)/ec/ec_ameth.c \
    $(CRYPTO_PATH)/ec/ec_asn1.c \
    $(CRYPTO_PATH)/ec/ec_check.c \
    $(CRYPTO_PATH)/ec/ec_curve.c \
    $(CRYPTO_PATH)/ec/ec_cvt.c \
    $(CRYPTO_PATH)/ec/ec_err.c \
    $(CRYPTO_PATH)/ec/ec_key.c \
    $(CRYPTO_PATH)/ec/ec_lib.c \
    $(CRYPTO_PATH)/ec/ec_mult.c \
    $(CRYPTO_PATH)/ec/ec_pmeth.c \
    $(CRYPTO_PATH)/ec/ec_print.c \
    $(CRYPTO_PATH)/ec/eck_prn.c \
    $(CRYPTO_PATH)/ec/ecp_mont.c \
    $(CRYPTO_PATH)/ec/ecp_nist.c \
    $(CRYPTO_PATH)/ec/ecp_smpl.c \
    $(CRYPTO_PATH)/ecdh/ech_err.c \
    $(CRYPTO_PATH)/ecdh/ech_key.c \
    $(CRYPTO_PATH)/ecdh/ech_lib.c \
    $(CRYPTO_PATH)/ecdh/ech_ossl.c \
    $(CRYPTO_PATH)/ecdsa/ecs_asn1.c \
    $(CRYPTO_PATH)/ecdsa/ecs_err.c \
    $(CRYPTO_PATH)/ecdsa/ecs_lib.c \
    $(CRYPTO_PATH)/ecdsa/ecs_ossl.c \
    $(CRYPTO_PATH)/ecdsa/ecs_sign.c \
    $(CRYPTO_PATH)/ecdsa/ecs_vrf.c \
    $(CRYPTO_PATH)/err/err.c \
    $(CRYPTO_PATH)/err/err_all.c \
    $(CRYPTO_PATH)/err/err_prn.c \
    $(CRYPTO_PATH)/evp/bio_b64.c \
    $(CRYPTO_PATH)/evp/bio_enc.c \
    $(CRYPTO_PATH)/evp/bio_md.c \
    $(CRYPTO_PATH)/evp/bio_ok.c \
    $(CRYPTO_PATH)/evp/c_all.c \
    $(CRYPTO_PATH)/evp/c_allc.c \
    $(CRYPTO_PATH)/evp/c_alld.c \
    $(CRYPTO_PATH)/evp/digest.c \
    $(CRYPTO_PATH)/evp/e_aes.c \
    $(CRYPTO_PATH)/evp/e_bf.c \
    $(CRYPTO_PATH)/evp/e_des.c \
    $(CRYPTO_PATH)/evp/e_des3.c \
    $(CRYPTO_PATH)/evp/e_null.c \
    $(CRYPTO_PATH)/evp/e_old.c \
    $(CRYPTO_PATH)/evp/e_rc2.c \
    $(CRYPTO_PATH)/evp/e_rc4.c \
    $(CRYPTO_PATH)/evp/e_rc5.c \
    $(CRYPTO_PATH)/evp/e_xcbc_d.c \
    $(CRYPTO_PATH)/evp/encode.c \
    $(CRYPTO_PATH)/evp/evp_acnf.c \
    $(CRYPTO_PATH)/evp/evp_enc.c \
    $(CRYPTO_PATH)/evp/evp_err.c \
    $(CRYPTO_PATH)/evp/evp_key.c \
    $(CRYPTO_PATH)/evp/evp_lib.c \
    $(CRYPTO_PATH)/evp/evp_pbe.c \
    $(CRYPTO_PATH)/evp/evp_pkey.c \
    $(CRYPTO_PATH)/evp/m_dss.c \
    $(CRYPTO_PATH)/evp/m_dss1.c \
    $(CRYPTO_PATH)/evp/m_ecdsa.c \
    $(CRYPTO_PATH)/evp/m_md4.c \
    $(CRYPTO_PATH)/evp/m_md5.c \
    $(CRYPTO_PATH)/evp/m_mdc2.c \
    $(CRYPTO_PATH)/evp/m_null.c \
    $(CRYPTO_PATH)/evp/m_ripemd.c \
    $(CRYPTO_PATH)/evp/m_sha1.c \
    $(CRYPTO_PATH)/evp/m_sigver.c \
    $(CRYPTO_PATH)/evp/m_wp.c \
    $(CRYPTO_PATH)/evp/names.c \
    $(CRYPTO_PATH)/evp/p5_crpt.c \
    $(CRYPTO_PATH)/evp/p5_crpt2.c \
    $(CRYPTO_PATH)/evp/p_dec.c \
    $(CRYPTO_PATH)/evp/p_enc.c \
    $(CRYPTO_PATH)/evp/p_lib.c \
    $(CRYPTO_PATH)/evp/p_open.c \
    $(CRYPTO_PATH)/evp/p_seal.c \
    $(CRYPTO_PATH)/evp/p_sign.c \
    $(CRYPTO_PATH)/evp/p_verify.c \
    $(CRYPTO_PATH)/evp/pmeth_fn.c \
    $(CRYPTO_PATH)/evp/pmeth_gn.c \
    $(CRYPTO_PATH)/evp/pmeth_lib.c \
    $(CRYPTO_PATH)/hmac/hm_ameth.c \
    $(CRYPTO_PATH)/hmac/hm_pmeth.c \
    $(CRYPTO_PATH)/hmac/hmac.c \
    $(CRYPTO_PATH)/krb5/krb5_asn.c \
    $(CRYPTO_PATH)/lhash/lh_stats.c \
    $(CRYPTO_PATH)/lhash/lhash.c \
    $(CRYPTO_PATH)/md4/md4_dgst.c \
    $(CRYPTO_PATH)/md4/md4_one.c \
    $(CRYPTO_PATH)/md5/md5_dgst.c \
    $(CRYPTO_PATH)/md5/md5_one.c \
    $(CRYPTO_PATH)/modes/cbc128.c \
    $(CRYPTO_PATH)/modes/cfb128.c \
    $(CRYPTO_PATH)/modes/ctr128.c \
    $(CRYPTO_PATH)/modes/ofb128.c \
    $(CRYPTO_PATH)/objects/o_names.c \
    $(CRYPTO_PATH)/objects/obj_dat.c \
    $(CRYPTO_PATH)/objects/obj_err.c \
    $(CRYPTO_PATH)/objects/obj_lib.c \
    $(CRYPTO_PATH)/objects/obj_xref.c \
    $(CRYPTO_PATH)/ocsp/ocsp_asn.c \
    $(CRYPTO_PATH)/ocsp/ocsp_cl.c \
    $(CRYPTO_PATH)/ocsp/ocsp_err.c \
    $(CRYPTO_PATH)/ocsp/ocsp_ext.c \
    $(CRYPTO_PATH)/ocsp/ocsp_ht.c \
    $(CRYPTO_PATH)/ocsp/ocsp_lib.c \
    $(CRYPTO_PATH)/ocsp/ocsp_prn.c \
    $(CRYPTO_PATH)/ocsp/ocsp_srv.c \
    $(CRYPTO_PATH)/ocsp/ocsp_vfy.c \
    $(CRYPTO_PATH)/pem/pem_all.c \
    $(CRYPTO_PATH)/pem/pem_err.c \
    $(CRYPTO_PATH)/pem/pem_info.c \
    $(CRYPTO_PATH)/pem/pem_lib.c \
    $(CRYPTO_PATH)/pem/pem_oth.c \
    $(CRYPTO_PATH)/pem/pem_pk8.c \
    $(CRYPTO_PATH)/pem/pem_pkey.c \
    $(CRYPTO_PATH)/pem/pem_seal.c \
    $(CRYPTO_PATH)/pem/pem_sign.c \
    $(CRYPTO_PATH)/pem/pem_x509.c \
    $(CRYPTO_PATH)/pem/pem_xaux.c \
    $(CRYPTO_PATH)/pem/pvkfmt.c \
    $(CRYPTO_PATH)/pkcs12/p12_add.c \
    $(CRYPTO_PATH)/pkcs12/p12_asn.c \
    $(CRYPTO_PATH)/pkcs12/p12_attr.c \
    $(CRYPTO_PATH)/pkcs12/p12_crpt.c \
    $(CRYPTO_PATH)/pkcs12/p12_crt.c \
    $(CRYPTO_PATH)/pkcs12/p12_decr.c \
    $(CRYPTO_PATH)/pkcs12/p12_init.c \
    $(CRYPTO_PATH)/pkcs12/p12_key.c \
    $(CRYPTO_PATH)/pkcs12/p12_kiss.c \
    $(CRYPTO_PATH)/pkcs12/p12_mutl.c \
    $(CRYPTO_PATH)/pkcs12/p12_npas.c \
    $(CRYPTO_PATH)/pkcs12/p12_p8d.c \
    $(CRYPTO_PATH)/pkcs12/p12_p8e.c \
    $(CRYPTO_PATH)/pkcs12/p12_utl.c \
    $(CRYPTO_PATH)/pkcs12/pk12err.c \
    $(CRYPTO_PATH)/pkcs7/pk7_asn1.c \
    $(CRYPTO_PATH)/pkcs7/pk7_attr.c \
    $(CRYPTO_PATH)/pkcs7/pk7_doit.c \
    $(CRYPTO_PATH)/pkcs7/pk7_lib.c \
    $(CRYPTO_PATH)/pkcs7/pk7_mime.c \
    $(CRYPTO_PATH)/pkcs7/pk7_smime.c \
    $(CRYPTO_PATH)/pkcs7/pkcs7err.c \
    $(CRYPTO_PATH)/rand/md_rand.c \
    $(CRYPTO_PATH)/rand/rand_egd.c \
    $(CRYPTO_PATH)/rand/rand_err.c \
    $(CRYPTO_PATH)/rand/rand_lib.c \
    $(CRYPTO_PATH)/rand/rand_unix.c \
    $(CRYPTO_PATH)/rand/randfile.c \
    $(CRYPTO_PATH)/rc2/rc2_cbc.c \
    $(CRYPTO_PATH)/rc2/rc2_ecb.c \
    $(CRYPTO_PATH)/rc2/rc2_skey.c \
    $(CRYPTO_PATH)/rc2/rc2cfb64.c \
    $(CRYPTO_PATH)/rc2/rc2ofb64.c \
    $(CRYPTO_PATH)/rc4/rc4_enc.c \
    $(CRYPTO_PATH)/rc4/rc4_skey.c \
    $(CRYPTO_PATH)/ripemd/rmd_dgst.c \
    $(CRYPTO_PATH)/ripemd/rmd_one.c \
    $(CRYPTO_PATH)/rsa/rsa_ameth.c \
    $(CRYPTO_PATH)/rsa/rsa_asn1.c \
    $(CRYPTO_PATH)/rsa/rsa_chk.c \
    $(CRYPTO_PATH)/rsa/rsa_eay.c \
    $(CRYPTO_PATH)/rsa/rsa_err.c \
    $(CRYPTO_PATH)/rsa/rsa_gen.c \
    $(CRYPTO_PATH)/rsa/rsa_lib.c \
    $(CRYPTO_PATH)/rsa/rsa_none.c \
    $(CRYPTO_PATH)/rsa/rsa_null.c \
    $(CRYPTO_PATH)/rsa/rsa_oaep.c \
    $(CRYPTO_PATH)/rsa/rsa_pk1.c \
    $(CRYPTO_PATH)/rsa/rsa_pmeth.c \
    $(CRYPTO_PATH)/rsa/rsa_prn.c \
    $(CRYPTO_PATH)/rsa/rsa_pss.c \
    $(CRYPTO_PATH)/rsa/rsa_saos.c \
    $(CRYPTO_PATH)/rsa/rsa_sign.c \
    $(CRYPTO_PATH)/rsa/rsa_ssl.c \
    $(CRYPTO_PATH)/rsa/rsa_x931.c \
    $(CRYPTO_PATH)/sha/sha1_one.c \
    $(CRYPTO_PATH)/sha/sha1dgst.c \
    $(CRYPTO_PATH)/sha/sha256.c \
    $(CRYPTO_PATH)/sha/sha512.c \
    $(CRYPTO_PATH)/sha/sha_dgst.c \
    $(CRYPTO_PATH)/stack/stack.c \
    $(CRYPTO_PATH)/ts/ts_err.c \
    $(CRYPTO_PATH)/txt_db/txt_db.c \
    $(CRYPTO_PATH)/ui/ui_compat.c \
    $(CRYPTO_PATH)/ui/ui_err.c \
    $(CRYPTO_PATH)/ui/ui_lib.c \
    $(CRYPTO_PATH)/ui/ui_openssl.c \
    $(CRYPTO_PATH)/ui/ui_util.c \
    $(CRYPTO_PATH)/x509/by_dir.c \
    $(CRYPTO_PATH)/x509/by_file.c \
    $(CRYPTO_PATH)/x509/x509_att.c \
    $(CRYPTO_PATH)/x509/x509_cmp.c \
    $(CRYPTO_PATH)/x509/x509_d2.c \
    $(CRYPTO_PATH)/x509/x509_def.c \
    $(CRYPTO_PATH)/x509/x509_err.c \
    $(CRYPTO_PATH)/x509/x509_ext.c \
    $(CRYPTO_PATH)/x509/x509_lu.c \
    $(CRYPTO_PATH)/x509/x509_obj.c \
    $(CRYPTO_PATH)/x509/x509_r2x.c \
    $(CRYPTO_PATH)/x509/x509_req.c \
    $(CRYPTO_PATH)/x509/x509_set.c \
    $(CRYPTO_PATH)/x509/x509_trs.c \
    $(CRYPTO_PATH)/x509/x509_txt.c \
    $(CRYPTO_PATH)/x509/x509_v3.c \
    $(CRYPTO_PATH)/x509/x509_vfy.c \
    $(CRYPTO_PATH)/x509/x509_vpm.c \
    $(CRYPTO_PATH)/x509/x509cset.c \
    $(CRYPTO_PATH)/x509/x509name.c \
    $(CRYPTO_PATH)/x509/x509rset.c \
    $(CRYPTO_PATH)/x509/x509spki.c \
    $(CRYPTO_PATH)/x509/x509type.c \
    $(CRYPTO_PATH)/x509/x_all.c \
    $(CRYPTO_PATH)/x509v3/pcy_cache.c \
    $(CRYPTO_PATH)/x509v3/pcy_data.c \
    $(CRYPTO_PATH)/x509v3/pcy_lib.c \
    $(CRYPTO_PATH)/x509v3/pcy_map.c \
    $(CRYPTO_PATH)/x509v3/pcy_node.c \
    $(CRYPTO_PATH)/x509v3/pcy_tree.c \
    $(CRYPTO_PATH)/x509v3/v3_akey.c \
    $(CRYPTO_PATH)/x509v3/v3_akeya.c \
    $(CRYPTO_PATH)/x509v3/v3_alt.c \
    $(CRYPTO_PATH)/x509v3/v3_bcons.c \
    $(CRYPTO_PATH)/x509v3/v3_bitst.c \
    $(CRYPTO_PATH)/x509v3/v3_conf.c \
    $(CRYPTO_PATH)/x509v3/v3_cpols.c \
    $(CRYPTO_PATH)/x509v3/v3_crld.c \
    $(CRYPTO_PATH)/x509v3/v3_enum.c \
    $(CRYPTO_PATH)/x509v3/v3_extku.c \
    $(CRYPTO_PATH)/x509v3/v3_genn.c \
    $(CRYPTO_PATH)/x509v3/v3_ia5.c \
    $(CRYPTO_PATH)/x509v3/v3_info.c \
    $(CRYPTO_PATH)/x509v3/v3_int.c \
    $(CRYPTO_PATH)/x509v3/v3_lib.c \
    $(CRYPTO_PATH)/x509v3/v3_ncons.c \
    $(CRYPTO_PATH)/x509v3/v3_ocsp.c \
    $(CRYPTO_PATH)/x509v3/v3_pci.c \
    $(CRYPTO_PATH)/x509v3/v3_pcia.c \
    $(CRYPTO_PATH)/x509v3/v3_pcons.c \
    $(CRYPTO_PATH)/x509v3/v3_pku.c \
    $(CRYPTO_PATH)/x509v3/v3_pmaps.c \
    $(CRYPTO_PATH)/x509v3/v3_prn.c \
    $(CRYPTO_PATH)/x509v3/v3_purp.c \
    $(CRYPTO_PATH)/x509v3/v3_skey.c \
    $(CRYPTO_PATH)/x509v3/v3_sxnet.c \
    $(CRYPTO_PATH)/x509v3/v3_utl.c \
    $(CRYPTO_PATH)/x509v3/v3err.c

local_ssl_src := \
    $(SSL_PATH)/s2_meth.c \
    $(SSL_PATH)/s2_srvr.c \
    $(SSL_PATH)/s2_clnt.c \
    $(SSL_PATH)/s2_lib.c \
    $(SSL_PATH)/s2_enc.c \
    $(SSL_PATH)/s2_pkt.c \
    $(SSL_PATH)/s3_meth.c \
    $(SSL_PATH)/s3_srvr.c \
    $(SSL_PATH)/s3_clnt.c \
    $(SSL_PATH)/s3_lib.c \
    $(SSL_PATH)/s3_enc.c \
    $(SSL_PATH)/s3_pkt.c \
    $(SSL_PATH)/s3_both.c \
    $(SSL_PATH)/s23_meth.c \
    $(SSL_PATH)/s23_srvr.c \
    $(SSL_PATH)/s23_clnt.c \
    $(SSL_PATH)/s23_lib.c \
    $(SSL_PATH)/s23_pkt.c \
    $(SSL_PATH)/t1_meth.c \
    $(SSL_PATH)/t1_srvr.c \
    $(SSL_PATH)/t1_clnt.c \
    $(SSL_PATH)/t1_lib.c \
    $(SSL_PATH)/t1_enc.c \
    $(SSL_PATH)/t1_reneg.c \
    $(SSL_PATH)/ssl_lib.c \
    $(SSL_PATH)/ssl_err2.c \
    $(SSL_PATH)/ssl_cert.c \
    $(SSL_PATH)/ssl_sess.c \
    $(SSL_PATH)/ssl_ciph.c \
    $(SSL_PATH)/ssl_stat.c \
    $(SSL_PATH)/ssl_rsa.c \
    $(SSL_PATH)/ssl_asn1.c \
    $(SSL_PATH)/ssl_txt.c \
    $(SSL_PATH)/ssl_algs.c \
    $(SSL_PATH)/bio_ssl.c \
    $(SSL_PATH)/ssl_err.c \
    $(SSL_PATH)/kssl.c

local_c_flags := -DNO_WINDOWS_BRAINDEATH

#######################################

# target
include $(CLEAR_VARS)
include $(LOCAL_PATH)/android-config.mk
LOCAL_SRC_FILES += $(local_crypto_src)
LOCAL_CFLAGS += $(local_c_flags)
LOCAL_C_INCLUDES += $(local_c_includes)
LOCAL_LDLIBS += -lz
ifeq ($(TARGET_ARCH),arm)
    LOCAL_SRC_FILES += $(arm_src_files)
    LOCAL_CFLAGS += $(arm_cflags)
else
    LOCAL_SRC_FILES += $(non_arm_src_files)
endif
ifeq ($(TARGET_SIMULATOR),true)
    # Make valgrind happy.
    LOCAL_CFLAGS += -DPURIFY
    LOCAL_LDLIBS += -ldl
endif
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= libcrypto
include $(BUILD_SHARED_LIBRARY)

#######################################
# host shared library
ifeq ($(WITH_HOST_DALVIK),true)
    include $(CLEAR_VARS)
    include $(LOCAL_PATH)/../android-config.mk
    LOCAL_SRC_FILES += $(local_crypto_src)
    LOCAL_CFLAGS += $(local_c_flags) -DPURIFY
    LOCAL_C_INCLUDES += $(local_c_includes)
    LOCAL_SRC_FILES += $(non_arm_src_files)
    LOCAL_LDLIBS += -ldl
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE:= libcrypto
    include $(BUILD_SHARED_LIBRARY)
endif
#######################################

include $(CLEAR_VARS)
include $(LOCAL_PATH)/android-config.mk
LOCAL_C_INCLUDES += $(local_c_includes)
LOCAL_SRC_FILES += $(local_ssl_src)
LOCAL_SHARED_LIBRARIES += libcrypto
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libssl
include $(BUILD_SHARED_LIBRARY)

#######################################

include $(CLEAR_VARS)
LOCAL_C_INCLUDES += $(local_c_includes)
LOCAL_SRC_FILES:=\
com_csii_desjni_DESJniUtil.h \
stdafx.h \
com_csii_desjni_DESJniUtil.c
LOCAL_SHARED_LIBRARIES += libssl libcrypto
LOCAL_LDLIBS += -llog
LOCAL_MODULE := DESJni
include $(BUILD_SHARED_LIBRARY)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
PHP和Java都有支持3DES加密和解密的库,可以通过这些库来实现互通。以下是一个简单的PHP和Java之间3DES加密和解密的例子: PHP代码: ```php $key = "123456789012345678901234"; // 24位密钥 $data = "Hello, world!"; // 待加密的数据 // 加密 $encrypted = openssl_encrypt($data, "DES-EDE3", $key, OPENSSL_RAW_DATA); $encrypted = base64_encode($encrypted); // 转成base64字符串 // 解密 $encrypted = base64_decode($encrypted); // 将base64字符串转成二进制数据 $decrypted = openssl_decrypt($encrypted, "DES-EDE3", $key, OPENSSL_RAW_DATA); echo $decrypted; // 输出:Hello, world! ``` Java代码: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import java.util.Base64; public class Main { public static void main(String[] args) throws Exception { String key = "123456789012345678901234"; // 24位密钥 String data = "Hello, world!"; // 待加密的数据 // 加密 byte[] encrypted = encrypt(data.getBytes("UTF-8"), key.getBytes("UTF-8")); String encryptedStr = Base64.getEncoder().encodeToString(encrypted); // 转成base64字符串 System.out.println(encryptedStr); // 解密 byte[] encryptedBytes = Base64.getDecoder().decode(encryptedStr); // 将base64字符串转成二进制数据 byte[] decrypted = decrypt(encryptedBytes, key.getBytes("UTF-8")); System.out.println(new String(decrypted, "UTF-8")); // 输出:Hello, world! } public static byte[] encrypt(byte[] data, byte[] key) throws Exception { DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(spec); Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(data); } public static byte[] decrypt(byte[] data, byte[] key) throws Exception { DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(spec); Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal(data); } } ``` 这两段代码都使用3DES算法进行加密和解密,PHP使用OpenSSL库,Java使用了JCE库。在加密时,PHP和Java使用了相同的密钥和加密模式(ECB),因此可以互相解密。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值