MONTREAL -- Columbus was a little faster to the puck than Montreal all night. The Blue Jackets, though, couldn't take advantage of their opportunities until late in the third period.
"They were first on the puck, making us react to them, putting us on our heels a bit," Montreal's Lars Eller said of the young and energized Columbus team in the heart of a heated playoff race. "When they do that, we take penalties."
Montreal took eight minor penalties and played more than 15 minutes down a man, including 50 seconds on a 5-on-3. Seven different players were whistled for penalties such as hooking, tripping, holding, high-sticking and once for having too many men on the ice.
But as successful as the Blue Jackets were in drawing penalties, their power play was a dud. Columbus went 0 for 8 with the extra skater, and saw all 13 power-play shots turned away by Canadiens goalie Carey Price.
Montreal has failed to score in its past 26 chances with a man advantage.
"We'd love to get a power-play goal," Columbus forward Brandon Dubinsky said. "It's going to be important down the stretch. But we didn't earn all those power plays without playing the right way."
Derek MacKenzie and Dubinsky also scored for Columbus. Sergei Bobrovsky, the reigning Vezina Trophy winner, made 25 saves while starting the Blue Jackets' 16th consecutive game and 23rd in the last 24.
Brendan Gallagher and Thomas Vanek scored for the Canadiens, and Price stopped 37 shots.
Montreal forwards Brian Gionta, Daniel Briere and Max Pacioretty saw their average ice time significantly reduced.
"There were a lot of guys sitting on the bench for long stretches that should have been out there," Eller said. "It's not good for our rhythm. We want to be five guys on the ice."
Johansen capitalized on rookie defenseman Jarred Tinordi's giveaway at the Canadiens' blue line. Johansen intercepted a weak pass and beat Price on a partial breakaway for his team-leading 27th.
"That doesn't feel good," Tinordi said. "It's a stupid play on my part. I put it on my backhand, trying to go through the middle. [Johansen's] a quick player. I should have anticipated he was going to be there."
The Blue Jackets have now picked up 15 points in their past 10 games (7-2-1) as they hold on to the last wild-card spot in the Eastern Conference.
Gallagher turned his stick into a baseball bat in the first, hitting a puck out of the air with 5:07 left to give the Canadiens a 1-0 lead. After an initial save, Gallagher took a swing at a waist-high puck, which floated above the net, landed on Bobrovsky chest and trickled past the goal line.
Columbus tied it exactly one minute later. With Johansen in the box for cross checking, MacKenzie scored a short-handed goal right off the faceoff.
The Blue Jackets are now tied for third in the league with nine short-handed goals on the season.
Columbus took the lead at 6:53 of the second when Dubinsky put his 14th of the year past an off-balance Price.
"We skated, we were physical, we fore-checked hard," Dubinsky said. "I liked our tenacity. We created turnovers."
After the Canadiens killed off three straight minor penalties to start the third, Vanek tied it at 2 at 7:46 with a slap shot from the faceoff circle to Bobrovsky's right.
Columbus finished 0 for 8 on the power play.
Brandon Prust (upper-body injury) was not in the lineup for the Canadiens. Prust was hurt in Tuesday's 6-3 victory against Colorado. Ryan White got the start in his place. ... RJ Umberger was a healthy scratch for the Blue Jackets. Rene Bourque and Douglas Murray sat out for the Canadiens. ... Pacioretty hasn't scored in seven games, his longest goal drought since November. He's two goals shy of 100 with the Canadiens. ... The Montreal Impact's Marco Di Vaio, Patrice Bernier and Justin Mapp were in attendance.