前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >共享密钥加密与公开密钥加密

共享密钥加密与公开密钥加密

作者头像
神奇的程序员
发布于 2022-04-10 01:09:03
发布于 2022-04-10 01:09:03
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

前言

加密数据的方法可以分为两种:加密和解密都使用相同密钥的“共享密钥加密”和分别使用不同密钥的“公开密钥加密”。

本文将以图文的形式讲解这两种加密的机制以及相关问题,挑选使用最为广泛两种加密算法,用JAVA将其实现,欢迎各位感兴趣的开发者阅读本文。

共享密钥加密

概念

共享密钥加密是加密和解密都是用相同密钥的一种加密方式,由于使用的密钥相同,所以这种算法也被称为“对称加密”,实现共享加密的算法有:「AES」「DES」「动态口令」等,其中AES的应用最为广泛。

处理流程图解

例如,A准备通过互联网向B发送数据

由于有被窃听的风险,所以需要把数据加密后再发送。

  • A使用密钥加密数据,并将密文发送给B。
  • B收到秘文后,使用相同的密钥对其进行解密。这样B就取得了原本的数据。此时的数据已经是加密好的了,就不需要担心第三者窃取数据了,因为它没有密钥解开此密文。

可能产生的问题

如图所示,B接收A发送的密文时,密文可能已经被X窃听了。

  • 此时,B不知道加密时使用的是什么密钥。
  • A需要通过某种手段将密钥交给B。和密文一样,A又在互联网上向B发送了密钥。
  • B使用收到的密钥对密文进行解密,但是该密钥也有可能会被X窃听,这样以来X也可以使用密钥对密文进行解密了。

❝使用共享密钥加密时,如果接收方不知道密钥是什么,发送方就要通过互联网发送密钥给接收方,此时密钥可能会被第三者监听,这就是共享密钥加密最大问题的所在。 ❞

解决方案

如上所述,共享密钥加密存在密钥送达问题,想要解决这个问题,我们可以使用“密钥交换协议”和“公开密钥加密”两种方法。

恩尼格玛密码机

第二次世界大战中,德军所用的”恩尼格玛密码机“使用的加密方式就是共享密钥加密,我们熟知的英国数学家「艾伦·图灵」就破解了这个密码机生成的密文,在二战中为英国做了很多的贡献,比如著名的“诺曼底登陆”事件,昨晚看了一部电影《模仿游戏》,该电影讲了图灵的一生,其中就包括了破解恩尼格玛密码机这一部分,挺好的一部电影,感兴趣的朋友可以去看看。

JAVA实现AES加密

我们用Java实现下AES加密。

  • 创建AESUtils文件,编写AES加密工具类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lk.util;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.SecureRandom;

public class AESUtils {
    /**
     * 密钥长度: 128, 192 or 256
     */
    private static final int KEY_SIZE = 128;

    /**
     * 加密/解密算法名称
     */
    private static final String ALGORITHM = "AES";

    /**
     * 随机数生成器(RNG)算法名称
     */
    private static final String RNG_ALGORITHM = "SHA1PRNG";

    /**
     * 生成密钥对象
     * @param key byte[] 类型参数
     * @return AES密钥对象
     */
    private static SecretKey generateKey(byte[] key) throws Exception {
        // 创建安全随机数生成器
        SecureRandom random = SecureRandom.getInstance(RNG_ALGORITHM);
        // 设置 密钥key的字节数组 作为安全随机数生成器的种子
        random.setSeed(key);

        // 创建 AES算法生成器
        KeyGenerator gen = KeyGenerator.getInstance(ALGORITHM);
        // 初始化算法生成器
        gen.init(KEY_SIZE, random);

        // 生成 AES密钥对象
        return gen.generateKey();
    }

    /**
     * 数据加密: 明文 -> 密文
     */
    public static byte[] encrypt(byte[] plainBytes, byte[] key) throws Exception {
        // 生成密钥对象
        SecretKey secKey = generateKey(key);

        // 获取 AES 密码器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 初始化密码器(加密模型)
        cipher.init(Cipher.ENCRYPT_MODE, secKey);

        // 加密数据, 返回密文

        return cipher.doFinal(plainBytes);
    }

    /**
     * 数据解密: 密文 -> 明文
     */
    public static byte[] decrypt(byte[] cipherBytes, byte[] key) throws Exception {
        // 生成密钥对象
        SecretKey secKey = generateKey(key);

        // 获取 AES 密码器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 初始化密码器(解密模型)
        cipher.init(Cipher.DECRYPT_MODE, secKey);

        // 解密数据, 返回明文
        return cipher.doFinal(cipherBytes);
    }

    /**
     * byte数组转16进制
     *
     * @param bytes byte数组
     * @return 返回16进制字符串
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte aByte : bytes) {
            String hex = Integer.toHexString(aByte & 0xFF);
            if (hex.length() < 2) {
                sb.append(0);
            }
            sb.append(hex);
        }
        return sb.toString();
    }

    /**
     * 16进制转byte
     * @param inHex 16进制字符串
     * @return byte
     */
    public static byte hexToByte(String inHex) {
        return (byte) Integer.parseInt(inHex, 16);
    }

    /**
     * 16进制转byte数组
     * @param inHex 16进制字符串
     * @return byte数组
     */
    public static byte[] hexToByteArray(String inHex) {
        int hexlen = inHex.length();
        byte[] result;
        if (hexlen % 2 == 1) {
            //奇数
            hexlen++;
            result = new byte[(hexlen / 2)];
            inHex = "0" + inHex;
        } else {
            //偶数
            result = new byte[(hexlen / 2)];
        }
        int j = 0;
        for (int i = 0; i < hexlen; i += 2) {
            result[j] = hexToByte(inHex.substring(i, i + 2));
            j++;
        }
        return result;
    }

    /**
     * 加密文件: 明文输入 -> 密文输出
     */
    public static void encryptFile(File plainIn, File cipherOut, byte[] key) throws Exception {
        aesFile(plainIn, cipherOut, key, true);
    }

    /**
     * 解密文件: 密文输入 -> 明文输出
     */
    public static void decryptFile(File cipherIn, File plainOut, byte[] key) throws Exception {
        aesFile(plainOut, cipherIn, key, false);
    }

    /**
     * AES 加密/解密文件
     */
    private static void aesFile(File plainFile, File cipherFile, byte[] key, boolean isEncrypt) throws Exception {
        // 获取 AES 密码器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 生成密钥对象
        SecretKey secKey = generateKey(key);
        // 初始化密码器
        cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secKey);

        // 加密/解密数据
        InputStream in = null;
        OutputStream out = null;

        try {
            if (isEncrypt) {
                // 加密: 明文文件为输入, 密文文件为输出
                in = new FileInputStream(plainFile);
                out = new FileOutputStream(cipherFile);
            } else {
                // 解密: 密文文件为输入, 明文文件为输出
                in = new FileInputStream(cipherFile);
                out = new FileOutputStream(plainFile);
            }

            byte[] buf = new byte[1024];
            int len = -1;

            // 循环读取数据 加密/解密
            while ((len = in.read(buf)) != -1) {
                out.write(cipher.update(buf, 0, len));
            }
            out.write(cipher.doFinal());    // 最后需要收尾

            out.flush();

        } finally {
            close(in);
            close(out);
        }
    }

    private static void close(Closeable c) {
        if (c != null) {
            try {
                c.close();
            } catch (IOException e) {
                // nothing
            }
        }
    }
}

  • 在main函数中测试工具类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public static void main(String[] args) throws Exception {
        // 原文内容
        String content = "你好,我是要发送的数据";

        // AES加密/解密用的原始密码
        String key = "MagicalProgrammer";

        // 加密数据, 返回密文
        byte[] cipherBytes = AESUtils.encrypt(content.getBytes(), key.getBytes());

        // byte[]转16进制
        String cipherString = AESUtils.bytesToHex(cipherBytes);

        // 输出加密后的16进制密文
        System.out.println("加密后的密文为: ");
        System.out.println(cipherString);

        // 解密数据, 返回明文
        byte[] plainBytes = AESUtils.decrypt(AESUtils.hexToByteArray(cipherString), key.getBytes());

        // 输出解密后的明文
        System.out.println("解密后结果为: ");
        System.out.println(new String(plainBytes));
    }

公开密钥加密

概念

公开密钥加密是加密和解密使用不同密钥的一种加密方法。由于使用的密钥不同,所以这种算法也被称为“非对称加密”。加密用的密钥叫做“公开密钥”,解密用的叫做“私有密钥”。

处理流程图解

如图所示,A通过互联网向B发送数据。

  • 首先,由接收方B来生成公开密钥和私有密钥。
  • 然后,将公开密钥发送给B。
  • A使用B发来的公开密钥加密数据
  • A将密文发送给B,B再使用私有密钥对密文进行解密。这样,B就得到了原本的数据。
  • 公开密钥和密文都是通过互联网传输的,因此可能被X窃听。但是,使用公开密钥无法解密密文,因此X也无法得到原本的数据。

❝实现公开密钥加密的算法有「RSA算法」「椭圆曲线加密算法」等,其中使用最为广泛的是RSA算法。 ❞

方便多人传输数据

在和多人传输数据时,使用公开密钥加密十分方便。

例如,B预先准备好了公开密钥和私有密钥,

公开密钥是不怕被人知道的,所以B可以把公开密钥发布在网上。

此时,有许多人都想向B发送数据。

  • 首先,想发送数据的人需要从王山取得B发布的公开密钥。
  • 然后,用获取到的公开密钥加密要发送的数据。
  • 最后,把密文发送给B
  • B用私有密钥对收到的密文进行解密,取得原本的数据。这种情况就不需要为每个发送对象都准备对应的密钥了。需要保密的私有密钥由接收方保管,所以安全性也更高。

❝如果使用共享密钥加密,密钥的需求数量会随着发送人数的增多而急剧增多。例如,有2个人相互发送数据,需要2个密钥,但是5个人相互发送数据就需要10个密钥,100人就需要4950个。假设有n个人需要相互发送数据,那么需要的密钥数量就为「n(n-1)/2」。 ❞

中间人攻击

公开密钥加密存在公开密钥可靠性的问题,B在给A发送公开密钥时,可能会被第三者拦截到这个公开密钥,第三者拿到公开密钥后,保存到本地,自己重新生成一个新的公开密钥发送给A,A使用第三者的公开密钥加密数据后,将数据发送给A时,第三者劫持A发送的数据,用自己的私有密钥解密数据,此时第三者就拿到了B要发送的数据,然后第三者用B的公开密钥再次对解密的数据进行加密,然后发送给B,B用自己的私有密钥正常解开了B发送的数据,整个发送与接收的过程中,没有发生任何问题,因此A也察觉不到数据已经泄漏,这种通过中途替换公开密钥来窃听数据的攻击方法就叫做「中间人攻击」

我们回到B生成公开密钥和私有密钥的时候,我们用PB表示公开密钥,SB表示私有密钥。

X想要窃听A发送给B的数据,于是他准备了公开密钥PX和私有密钥SX。

  • 在B把公开密钥PB发送给A的时候
  • X把公开密钥PB替换成自己的PX
  • 于是公开密钥Px传到了A那里,由于公开密钥无法显示自己是由谁生成的,所以A不会发现自己收到的公开密钥已经被人替换。
  • A使用公开密钥PX对数据加密
  • 当A把想要给B的密文发送出去后,X接收了这个密文。
  • 这个密文由X生成的公开密钥PX加密而成,所以X可以用自己的私有密钥SX对密文进行解密。
  • X用B生成的公开密钥PB加密数据
  • X把密文发送给B,这个密文由B发出的公开密钥PB加密而成,所以B可以用自己的私有密钥SB来解密,从收到密文到解密密文都没发生任何问题,因此B也不可能意识到自己已经被窃听。

解决方案

公开密钥的可靠性会出现问题,因此A无法判断收到的公开密钥是否来自B,要想解决这一问题,就要用到“数字证书。

公开密钥加密还有一个问题,加密和解密都比较耗时。所以这种方式不适用于持续发送零碎数据的情况,要想解决这一问题,就要用到“混合加密”。

实现难点

要想找到实现公开密钥加密的算法并不容易。考虑到加密所需的计算流程,算法必 须满足如下条件。

  • 可以使用某个数值对数据进行加密
  • 使用另一个数值对加密数据进行计算就可以让数据恢复原样。
  • 无法从一种密钥推算出另一种密钥。

稍微思考一下便知道,想要找到满足以上条件的算法难度有多大。所以,RSA 等可 以实现公开密钥加密的算法的提出,对当今互联网社会的安全有着重要的意义。

JAVA实现RSA加密

我们用Java实现下RSA加密

  • 创建RSAUtils文件,编写RSA加密工具类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.lk.util;

import java.util.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

/**
 * RSA加密工具类
 */
public class RSAUtils {
    /**
     * 密钥长度 于原文长度对应 以及越长速度越慢
     */
    private final static int KEY_SIZE = 1024;
    /**
     * 用于封装随机产生的公钥与私钥
     */
    private static Map<Integer, String> keyMap = new HashMap<Integer, String>();

    /**
     * 随机生成密钥对
     */
    public static Map genKeyPair() throws NoSuchAlgorithmException {
        // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器
        keyPairGen.initialize(KEY_SIZE, new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        // 得到公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
        // 得到私钥字符串
        String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
        // 将公钥和私钥保存到Map
        //0表示公钥
        keyMap.put(0, publicKeyString);
        //1表示私钥
        keyMap.put(1, privateKeyString);
        return keyMap;
    }

    /**
     * RSA公钥加密
     *
     * @param str       加密字符串
     * @param publicKey 公钥
     * @return 密文
     * @throws Exception 加密过程中的异常信息
     */
    public static String encrypt(String str, String publicKey) throws Exception {
        //base64编码的公钥
        byte[] decoded = Base64.getDecoder().decode(publicKey);
        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
        //RSA加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));
        return outStr;
    }

    /**
     * RSA私钥解密
     *
     * @param str        加密字符串
     * @param privateKey 私钥
     * @return 明文
     * @throws Exception 解密过程中的异常信息
     */
    public static String decrypt(String str, String privateKey) throws Exception {
        //64位解码加密后的字符串
        byte[] inputByte = Base64.getDecoder().decode(str);
        //base64编码的私钥
        byte[] decoded = Base64.getDecoder().decode(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
        //RSA解密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        String outStr = new String(cipher.doFinal(inputByte));
        return outStr;
    }
}

  • 在main函数中测试工具类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws Exception {
        // 随机生成的密钥和公钥
        Map<Integer, String> keyMap = new HashMap<Integer, String>();
        //生成公钥和私钥
        keyMap = RSAUtils.genKeyPair();
        System.out.println("公钥:" + keyMap.get(0));
        System.out.println("私钥:" + keyMap.get(1));

        // 要加密的数据
        String message = "你好,我是通过RSA加密的数据";

        // 使用公钥加密
        String messageEn = RSAUtils.encrypt(message, keyMap.get(0));
        System.out.println("密文:" + messageEn);

        // 使用私钥解密
        String messageDe = RSAUtils.decrypt(messageEn, keyMap.get(1));
        System.out.println("解密:" + messageDe);
    }

写在最后

  • 文中使用的图片源自《我的第一本算法书》,如若侵权,请评论区留言,作者立即删除相关图片。
  • 文中如有错误,欢迎在评论区指正
  • 本文首发于掘金,未经许可禁止转载💌
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神奇的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
资本退潮,寒冬下的共享单车山穷水尽了吗?
尽管哈罗单车近期传出的新一轮融资的消息让共享单车市场再次回到了人们的视野中,但是共享单车市场当下无疑正在经历一场前所未有的寒冬。被资本助推的竞争热潮的逐渐减退开始让人们更加理性地看待这个在移动互联网后时代诞生的全新物种,它究竟是不是共享经济?它的未来究竟要向何处去始终都在困扰着人们。
孟永辉
2018/08/01
1520
资本退潮,寒冬下的共享单车山穷水尽了吗?
共享单车的洗牌:既分高下,也决生死
共享单车的败局并未因关注度的减少而停滞不前,相反整个行业开始弥漫着比以往任何时候都萧瑟的死亡气息。摩拜单车即使投身美团却依然亏损,ofo不断爆出资金链断裂的消息,即使前段时间被奉作“逆袭样本”的哈啰单车同样在承受着外界审慎的目光。尽管每一家共享单车平台面对的情况不同,但是整个资本驱动的共享单车市场进入到下沉期已经是一个不争的事实。
孟永辉
2018/09/20
3040
共享单车的洗牌:既分高下,也决生死
蚂蚁金服投资ofo,小黄模式将要领跑?
数据猿导读 4月22日,ofo小黄车宣布获得蚂蚁金服战略投资。双方将在支付、信用、国际化等领域展开全面深化战略合作,进一步带动共享单车行业的用户体验升级,助力绿色出行和低碳生活,共同推进无现金社会建设
数据猿
2018/04/23
6160
蚂蚁金服投资ofo,小黄模式将要领跑?
漩涡之下,共享单车如何才能成为“弄潮儿”?
文|孟永辉 共享单车的底牌越来越明显,继传出摩拜和ofo即将合并的传闻之后,又有投资人表示共享单车不能靠投资来维持,必须实现自我盈利。在经历了将近一年的发展之后,共享单车作为一种后“互联网+”时代的商业模式开始逐步进入到调整期。 不断有共享单车平台关门倒闭,不断有用户反馈押金无法及时退还,共享单车遭遇到的是越来越多的质疑和诟病。在整个行业的发展逐步进入到新技术阶段的当下,共享单车的发展模式似乎已经不再具有新颖性,资本和市场对于共享单车的耐心变得越来越少。 共享单车在刚刚出现的时候,之所以能够受到诸多资本巨头
孟永辉
2018/05/15
5960
摩拜单车启动全国免押金,共享单车开启全新洗牌模式
共享单车的故事似乎已经讲完,从情怀到现实,共享单车开始回归到一个真正它应该回归的水平。尽管共享单车的资本大战业已告一段落,但是后资本时代的共享单车市场依然好戏连台。因为这个事情或许是真正考验共享单车平台是否能够真正实现深度运营,从而找到变现方式和渠道的能力。
孟永辉
2018/08/01
2960
摩拜单车启动全国免押金,共享单车开启全新洗牌模式
摩拜单车融资后,共享单车向何处去?
文/孟永辉 共享单车始终被看作是今年互联网世界一个非常值得关注的现象级事件。因为随着“互联网+”创业浪潮的逐渐退去,很多互联网创业者都开始遭遇到前所未有的融资难题。共享单车被资本持续关注的异军突起让我们有理由将它定义为一个逆市场而动的存在。 然而,随着共享单车竞争的逐步加剧,特别是共享单车持续投入市场之后,平台自身运营以及用户自身选择的影响,让共享单车市场中的竞争着开始逐步拉大彼此之间的差距。摩拜单车再次获得E轮融资就是这一现象的具体体现。 据最新消息显示,全球智能共享单车行业首创者摩拜单车于6月16日完
孟永辉
2018/05/11
7350
利益角逐:摩拜单车与ofo合并的最大变数
文|孟永辉 著名投资人朱啸虎有关摩拜单车与ofo若想盈利必先合并的言论再次引发人们关注。有关摩拜单车与ofo能否合并的讨论开始出现,整个市场再次将目光聚焦在了这两大共享单车巨头的身上。人们之所以会对这个问题如此关注,除了有滴滴与优步合并的前车之鉴之外,更多的是在关注共享单车市场。 毋庸置疑,摩拜单车和ofo是处于共享单车"食物链"顶端的存在,如果两者合并将会对整个共享单车市场,甚至对整个共享经济市场都会产生影响。前期资本的轮番加注以及以阿里、腾讯为代表的互联网巨头的参与都不断强化着两者之间的影响力。另外,
孟永辉
2018/05/15
5700
摩拜被美团收购后,这家公司为什么一再传出被收购的消息?
我们都知道,共享单车已经进入了洗牌期。所谓的洗牌期就是每一家共享单车平台不能一味地依靠资本来生存了,它要自己摸索变现的方式来保证自己可以在资本之外获得发展。进入到洗牌期之后,多家共享单车平台已经出现问题,跑路、倒闭等乱象不断出现。
孟永辉
2018/08/10
4240
摩拜被美团收购后,这家公司为什么一再传出被收购的消息?
ofo上线信息流功能,共享单车商业化探索能成功吗?
摩拜单车被招至美团麾下之后,共享单车市场的烧钱大战似乎已经告一段落。当然,这或许也不是共享单车市场烧钱路子终结的标志,但共享单车市场的洗牌风暴或许已经来临。早在摩拜卖身之前,其实共享单车市场就已经开始了一场洗牌浪潮,酷骑单车、小蓝单车、悟空单车等诸多共享单车平台陆续出现了关门跑路的情况,以共享经济为主要概念的共享单车市场在资本退潮的时刻遭遇到了从资本驱动向自身盈利的阵痛期。 作为共享单车市场的头部公司,尽管摩拜单车和ofo在市场规模、用户数据等诸多方面都占据非常领先的优势,但是如果他们依然找不到好的变现方式
孟永辉
2018/07/04
5310
从狂热到平静,共享单车的方向与未来正逐渐清晰
有关ofo即将被收购的消息再度引发关注,共享单车市场在经历了前期资本的鼓噪与推动之后开始回归平静的市场状态。对于共享单车未来的走向,市场似乎依然没有一个明确的答案。从当前共享单车的市场状态来看,回归巨头的怀抱似乎是一个非常好的归宿,摩拜投身美团就说明了这一点。
孟永辉
2018/08/10
3170
从狂热到平静,共享单车的方向与未来正逐渐清晰
共享单车并非共享,同样要经历下半场
文|孟永辉 基于共享经济产生的共享单车成功抓住了互联网下半场的尾巴,继轮番获得融资之后,共享单车的布局大战开始如火如荼地进行。很多人会将共享单车的兴起与人们最后一公里的出行痛点结合在一起,并将共享单车的出现看作是资本寒冬下一场由资本自导自演的闹剧。 存在即是合理。共享单车既然能够在短时间内占据人们的视野,并成为整个互联网圈都在议论的话题自然有它能够吸引人的地方。深入探究共享单车的出现和兴起,似乎与其前辈Uber、滴滴有着相同的路径。前期都是各路英雄蜂拥进入,用户抢夺大战此起彼伏,等到用户争夺行将结束,一个
孟永辉
2018/05/11
4780
投身区块链,或许也救不了ofo
如果用一个词来形容当前的ofo,那么用“迷茫”再合适不过了。这就像是一个在战场上经常打仗的士兵,等到仗打完了,突然不知道应该做什么了。这种境遇在ofo的身上同样有所表现。在经历了共享单车的大战之后,ofo的敌人一个个散去,在苍茫的战场上只有ofo在仗剑前行。要么有人有了好的归宿,要么有人退出了共享单车市场,要么早已嫁作他人。
孟永辉
2018/09/20
3210
投身区块链,或许也救不了ofo
摩拜投身新美大,ofo布局区块链,共享单车真的黄了?
文/孟永辉 摩拜单车被收编之后,原本竞争激烈的共享单车市场有了平静的迹象。除了ofo依然在倔强地坚持之外,其他的共享单车公司开始回归到相对较为平稳的发展状态之中。这其实是共享单车发展的必然,因为资本驱动的发展模式必然无法长久,想要获得长久的发展必须要回归行业的本质,创新商业模式,才能走得更加长远。 然而,不可否认的是,共享单车作为一种新的物种的确给人们的生活带来了便利。作为一种新生的事物,共享单车还会在未来出现在我们的生活当中。只是未来共享单车想要走得更加长远,则需要更加创新发展模式才行。 我们看到现在of
孟永辉
2018/06/19
5080
ofo 再融4.5亿美元,单车大战胜负手已现?
投资方正在为街头上的自行车大战源源不断地补充弹药。 今天ofo宣布完成D轮融资,金额达到4.5亿美元,DST领投,滴滴、中信产业基金、经纬中国、Coatue、Atomico、新华联集团等多家国内外机构跟投。在给媒体的通稿中,ofo也刻意强调,“4.5亿美元融资额成为共享单车行业至今为止行业最大规模的一次。”这个金额比摩拜近日的3亿美元高出50%。 之所以如此强调融资金额高出对手,在我看来体现出ofo的决胜之心。 融资频率刷新互联网行业纪录 在谈论这次的融资之前,先来看一下共享单车行业的融资历史。 共享单车
罗超频道
2018/04/26
5130
ofo 再融4.5亿美元,单车大战胜负手已现?
共享单车的通往自由之路
继摩拜卖身美团之后,共享单车市场开始逐步走向平静。很多人将这个事件看作是共享单车走向下半场的标志。然而,作为有个互联网巨头和资本巨头曾经战斗过的地方,尽管共享单车已经进入到了下半场,它的一举一动依然会引起行业的关注。哈罗单车新一轮融资的消息就将原本有些平静的共享单车市场引向了全新的高潮。
孟永辉
2018/08/01
3810
共享单车的通往自由之路
滴滴收购ofo一旦完成,共享单车的新战役或将开启
在摩拜投入到美团旗下之后,共享单车市场上人们开始关注ofo的未来走向。尽管ofo一直在向外界释放想要独立发展的信号的,但是靠低回报、高成本的运营模式告诉我们,仅仅依靠用户押金和租车费用难以支撑庞大的运营业务。
孟永辉
2018/08/01
2870
滴滴收购ofo一旦完成,共享单车的新战役或将开启
ofo获蚂蚁金服投资,头部资源聚集将成下一个滴滴?
创业公司和互联网巨头战略合作,往往是给融资埋下的伏笔。在与蚂蚁金融旗下的芝麻信用在上海、杭州等地合作“信用解锁”之后,4月22日ofo宣布获得蚂蚁金服战略投资,双方将在支付、信用、国际化等领域展开全面
罗超频道
2018/04/16
5930
ofo获蚂蚁金服投资,头部资源聚集将成下一个滴滴?
共享单车的未来可能不再是共享单车
文|孟永辉 共享单车市场混战的局面有些像O2O市场的乱战,表面上我们看到的是各大O2O平台之间的混战,而实际上则是O2O市场背后一些市场元素的竞争。共享单车也是如此,表面上看,当前的共享单车大战是以摩拜单车、ofo为代表的共享单车平台之间进行的用户争夺大战,而实际情况却是以共享单车为切入点的第三方支付的战争。 微信和摩拜单车走到了一起,支付宝将入口开放给六大共享单车平台……表面上看只是这些流量将入口开放给共享单车平台,让共享单车能够给更多用户使用;实际上以微信和支付宝为代表的流量平台与以摩拜单车和ofo为
孟永辉
2018/05/11
7010
美团将全资收购摩拜,胡玮炜在收购前已准备出售股份
源 / 36氪 文 / 曹倩、杨林 如今收购摩拜单车,将会为美团的估值更添一道砝码,美团求之不得。 继收购饿了么之后,也许阿里是时候考虑拿下ofo了。 36氪获悉,4月3日晚间,摩拜单车就美团收购一案举办了股东会议。根据《新京报》报道,经股东投票,最终确定美团以35%美团股权、65%的现金收购摩拜单车,而摩拜的早期投资方和创始团队均已套现出局。华兴资本是此次交易的撮合方。 36氪了解到,滴滴此前也曾有意投资入股或收购摩拜,最后双方未能达成一致。在此次收购消息传出之前,摩拜单车创始人胡玮炜就已
顶级程序员
2018/04/26
8010
美团将全资收购摩拜,胡玮炜在收购前已准备出售股份
摩拜进入意大利这两个城市,对中国互联网出海有何启示?
日前摩拜单车进入意大利的两座城市:佛罗伦萨和米兰,暂时投入数百辆车试运营,8月初在这两个城市正式运营后将投入4000辆单车。今天,共享单车出海已经不是什么新闻,不过摩拜这种重资产、重运营的模式能够有这
罗超频道
2018/04/25
6830
摩拜进入意大利这两个城市,对中国互联网出海有何启示?
推荐阅读
相关推荐
资本退潮,寒冬下的共享单车山穷水尽了吗?
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 前言
  • 共享密钥加密
    • 概念
    • 处理流程图解
    • 可能产生的问题
    • 解决方案
    • 恩尼格玛密码机
    • JAVA实现AES加密
  • 公开密钥加密
    • 概念
    • 处理流程图解
    • 方便多人传输数据
    • 中间人攻击
    • 解决方案
    • 实现难点
    • JAVA实现RSA加密
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档