Android 数据传输加密

1.一般流程

1.服务端生成RSA公钥私钥
2.客户端向服务端请求RSA公钥
3.客户端收到的RSA公钥,使用RSA公钥加密AES密发送给服务端
4.服务端收到AES公钥后,客户端发送消息将会使用AES密钥加密,服务端使用AES密钥解密
在这里插入图片描述

2.具体实现

主要为客户端的代码实现

2.1AES密钥生成

    /**
     * 生成密钥
     */
    fun generateRandomKey(): ByteArray {
        val keygen: KeyGenerator = try {
            KeyGenerator.getInstance("AES")
        } catch (e: NoSuchAlgorithmException) {
            throw RuntimeException(" generateRandomKey fail!", e)
        }
        val random = SecureRandom()
        keygen.init(random)
        val key: Key = keygen.generateKey()
        return key.encoded
    }

2.2使用RSA公钥加密AES密钥

公钥会以模(modulus)和公钥指数(publicExponent)的形式收到,可将模和公钥指数转换为公钥后使用

    /**
     * 使用RSA公钥加密
     * @param source 需要加密的数据
     * @param modulus 模数
     * @param publicExponent 公钥指数
     */
    @Throws(Exception::class)
    fun encrypt(source: ByteArray?, modulus: ByteArray?, publicExponent: ByteArray?): ByteArray {
        if (null == modulus || null == publicExponent) return source!!
        val key: Key = getPublicKey(modulus, publicExponent)
        /* 得到Cipher对象来实现对源数据的RSA加密 */
        val cipher = Cipher.getInstance("RSA/ECB/NoPadding")
        cipher.init(Cipher.ENCRYPT_MODE, key)
        /* 执行加密操作 */
        return cipher.doFinal(source)
    }
    /**
     * 使用模数、公钥指数获得公钥
     * @param modulus    模数
     * @param publicExponent   公钥指数
     */
    private fun getPublicKey(modulus: ByteArray, publicExponent: ByteArray): PublicKey {
        val bigIntModulus = BigInteger(1, modulus)
        val bigIntPrivateExponent = BigInteger(1, publicExponent)
        val keySpec = RSAPublicKeySpec(bigIntModulus, bigIntPrivateExponent)
        val keyFactory = KeyFactory.getInstance("RSA")
        return keyFactory.generatePublic(keySpec)
    }

2.3使用AES密钥加密消息

    /**
     * 加密
     * @param data 需要加密的消息
     * @param key  密钥
     */
    fun encrypt(data: ByteArray, key: ByteArray): ByteArray {
        return try {
            val len = 16 - data.size % 16
            val list = data.toMutableList()
            for (i in 0 until len) {
                list.add(0)
            }
            val secretKey = SecretKeySpec(key, "AES")
            val cipher = Cipher.getInstance("AES/ECB/NoPadding") // 创建密码器
            cipher.init(Cipher.ENCRYPT_MODE, secretKey) // 初始化
            cipher.doFinal(list.toByteArray()) // 加密
        } catch (e: Exception) {
            e.printStackTrace()
            throw RuntimeException("encrypt fail!", e)
        }
    }

3.注意事项

1.加密所使用的转换模式需要两端保持一直,上面使用了RSA/ECB/NoPadding AES/ECB/NoPadding

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android系统自带的热点功能可以作为网络通讯的媒介,在连接到热点的设备之间传输数据。因为传输语音数据需要保证实性和稳定性,所以在热点传输语音数据需要考虑以下方面。 首先,需要选用适合的网络传输协议。传输语音数据需要保证实性和稳定性,所以应该选用UDP协议而不是TCP协议。因为UDP协议没有TCP协议的握手和确认机制,可以减少传输延,适合用于实数据的传输。 其次,需要考虑语音编码和解码方法。选择合适的编码格式可以既保证语音质量,又减小数据量,提高传输效率。当前常用的音频编码格式有AMR、AAC和PCM等,不同的编码格式具有不同的特点,需要根据具体情况进行选择。 最后,需要关注网络带宽的使用情况。在热点连接的设备数量较多,需要合理分配带宽资源,避免网络拥塞导致的延迟和数据传输中断。可以采用动态带宽分配算法,根据设备连接情况动态分配带宽,保证语音传输质量。 总之,在热点传输语音数据方面,需要选用适合的网络协议、选择合适的编码格式并关注网络带宽的使用情况,这样才能达到良好的传输效果。 ### 回答2: 安卓系统的热点传输功能是指在手机作为热点连接方式,其他设备可以通过无线连接接入该热点并进行数据传输。而语音数据传输则指的是将人类的语音信息进行数字化处理转换成可传输的数据,通过音频传输的方式进行交流。在安卓系统中,可以利用热点传输语音数据的方式进行语音通话或语音聊天等功能操作。 首先,在使用热点传输语音数据,需要保证手机本身有语音通话的功能,可以通过内置麦克风和扬声器实语音交流。然后,在手机设置中开启热点功能并选择“安全性较高的WPA2 PSK”方式,以加密数据传输,防止信息泄露。 对于其他设备进行连接,需要在设备设置中找到手机的WiFi热点,输入安全密码并成功连接该热点。在进行语音通话或聊天,可以利用已经安装的通讯类应用实,例如常用的Skype、微信、QQ等。通过这些应用,用户可以进行语音交流,并且可进行单人或多人语音通话,实真正意义上的远程语音交流功能。 总之,利用安卓系统的热点传输语音数据功能,可以实简单方便的远程语音通话和聊天,达到人与人之间的交流和沟通。当然,在进行该功能操作,需要注意安全性以及网络稳定性,才能保证良好的使用效果。 ### 回答3: Android系统提供了多种方式来热点传输语音数据,如使用网络实通信协议(WebRTC)库或第三方音频传输库等。其中,WebRTC库是一个Google开源的跨平台实通信库,支持音频、视频和数据传输使用WebRTC库,可以在应用之间通过网络热点传输语音数据,并实高质量的音频通信。此外,第三方音频传输库也是常用的实语音传输的方式之一,常见的有OpenSL ES和AudioTrack等,这些库提供了音频编解码、信号处理和传输等功能,可用于实高效的音频传输和通信。 在使用这些库实语音传输,需要考虑以下问题: 1. 音频编码和解码:需要选择适合实际应用的音频编码格式,以确保音质和传输效率。通常使用较常见的音频编码格式,如opus或aac。 2. 网络传输:通过热点网络传输语音数据,需要考虑带宽和延迟等问题,以便实高效的音频通信。可以通过使用带宽自适应技术、网络拥塞控制等方式,来提高音频传输的效率。 3. 声音效果:为了实更好的用户体验,还需要考虑音频质量和可靠性等方面的问题,如消除回声、降噪等。 总之,Android系统提供了多种方式来实热点传输语音数据,这些方式可以根据实际需求和应用场景进行选择和使用。但无论使用何种方式,都需要考虑音质、传输效率以及用户体验等方面的问题,以便实高效稳定的语音通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值